2013-06-24 2 views
1

Как я могу получить все зависимости Go пакетов сразу, используя теги версии для конкретных импортных данных?Захватывание зависимостей пакетов Go с помощью тегов

Скажет у меня идет дерево с несколькими пакетами в нем:

src/ 
    foo/ 
     bar/    (go code in package bar) 
      x.go 
     quux/    (go code in package main) 
      y.go 

Теперь пакет `бар» зависит от сторонней библиотеки, которые используют версии тегов
(то есть, как правило, выбирается с: идти прибудете -tags mylib_2.0 github.com/user/mylib)

То, что я хочу сделать, это указать тег на импортном линии так что идут получить./... на моем дереве получает правильная версия sche меня. Что-то вроде:

import "github.com/user/mylib" `tags=mylib_2.0` 
+0

Re: _ "Я хочу сделать это укажите тег в строке импорта, чтобы go get./... на моем дереве получена правильная версия схемы. "_ Это вообще не возможно. И это не характерно для Go. – zzzz

+0

Итак, как я могу считать этот случай? (скажем, это автоматизированная система сборки) Есть ли способ обхода? – 3XX0

+0

Если это невозможно в общем случае, тогда нет способа справиться с ним в общем случае. Рассмотрим a1-> b1-> d1 и a1-> c1-> d2. Какая версия d должна пройти проверку? Вы не можете одновременно иметь две (или более) разные версии репо в одном и том же месте. Но местоположение зависит исключительно от пути импорта, а не от любой версии. – zzzz

ответ

1

изменения проецировании структуры тоже:

src/ 
    foo/ 
     bar/ 
      v1/ (go code in package bar) 
       x.go 
      v2/ 
       x.go 
     quux/ 
      v1/ (go code in package main) 
       y.go 

это единственно возможный способ справиться с другой версией LIBS.

с этим вы также решаете описанную проблему jnml, теперь каждая библиотека будет иметь свои собственные зависимости и версии для других библиотек.

обновление из-за комментариев:

согласно рабочей документации описано здесь:
http://golang.org/doc/code.html#Workspaces

ваша структура будет lõoke как

src/ 
    foo/ 
     bar/ 
      v1/ (go code in package bar) 
       x.go 
      v2/ 
       x.go 
     quux/ 
      v1/ (go code in package main) 
       y.go 
     meier/ 
      v1/ (go code in package main) 
       w.go 
      v2/ (go code in package main) 
       w.go 

теперь в вашем бар Lib (х. go) вам нужны функции из lib * quux (y.go)
импортировать это напишет:

import "foo/quux/v1/" 

так же, как примечание вы можете также сделать версию перед пакетом в вашей структуре, так вместо обув/quux/v1 Ваша структура может выглядеть следующим образом/Foo/v1/quux, то вам не нужно имя импорт.

Теперь Lib quux использует Lib Meier в версии 1
так импорт будет:

import "foo/meier/v1" 

и в отношении к jnml, теперь вы импровизировать бар также нуждается в Lib Meier но в версии 2
поэтому импорт будет выглядеть так:

import "foo/meier/v2" 

теперь, когда вы звоните: бар -> quux -> Meier
вы увидите, что вы не можете назначить/передать возвращаемое значение в бар к чему-то из Meier

, потому что: meier/v1! = Meier/v2

и это не удастся уже во время компиляции.

, если вам нужно работать с результатом от quux который исходит от Meier v1 вам нужно импортировать Meier/v1 в бар

+0

Он решает только/не более местонахождение. Он не решает назначать несовместимые типы v1.T и v2.T (транзитно доступные в одном пакете), функции запуска выполняются дважды, удваивание глобальных переменных и т. Д. – zzzz

+0

да, но транзитное использование lib/api - это то, что вы не должен делать вообще, а другой, да, они два раза, но то, что он хочет –

+0

Рассмотрим a1-> b1-> d1 и a1-> c1-> d2. Теперь: 'package a; import ("b"; "c"); func main() {x, y: = b.F(), c.F()} // x не присваивается y'. 'пакет b; import «d»; func F() d.T {return d.T {}} ',' package c; import «d»; func G() d.T {return d.T {}} '. Транзитивное использование типов невозможно избежать в нетривиальных программах. – zzzz