Go, go get, go install, локальные пакеты и контроль версий


у меня возникли проблемы с пониманием процесса создания проекта локального пакеты.

скажем, я создаю новый проект, используя git для управления версиями, который имеет main.перейти к файлу и инструментам.идите файл, который будет в пакете utils. Поэтому у меня есть структура каталогов, такая как это:

/myproject/
   main.go
   utils/
     tools.go

главная.go выглядит так:

package main
import "./utils"
func main() {
    utils.DoSomthing()
}

и инструменты.go выглядит так:

package utils;
func DoSomething() {
}

все работает просто отлично локально, используя go строй и бежать. Но это размещается на github, и я хотел бы иметь возможность использовать другие иди команда для его установки. Поэтому локальный импорт пакетов должен быть изменен, чтобы использовать формат "github.com/user/project/utils", который работает, за исключением того, что теперь у меня есть две копии исходного кода, и реальная проблема заключается в том, что копия с историей git имеет импорт, который использует загруженную копию. Поэтому, если я работаю над копией с историей git, любые изменения, внесенные в инструментарий.go останется незамеченным, потому что он будет использовать загруженную копию.

Так что мне интересно, если кто-то может объяснить правильный способ использования иди, контроль версий и импорт пакетов в рамках одного проекта.

4 56

4 ответа:

я только что написал краткое пошаговое руководство о том, как я использую новый go tool и github.com. вы можете найти это полезным:

1. Установите свой ГОПАТ

вы можете установить переменную окружения GOPATH папку. Если у вас есть большие проекты, это, вероятно, хорошая идея, чтобы создать различные ГОПАТ для каждого из них. Я бы рекомендовал этот подход особенно для развертывания, так что обновление библиотеки для проекта A не нарушает проект B, который может потребовать более ранней версии той же самой библиотеки.

также обратите внимание, что вы можете установить свой GOPATH в список каталогов, разделенных двоеточиями. Таким образом, у вас может быть GOPATH, содержащий все обычно используемые пакеты, и отдельные GOPATH для каждого проекта с дополнительными пакетами или различными версиями существующих пакетов.

но если вы не работаете над множеством разных проектов Go одновременно, его, вероятно, достаточно, чтобы иметь только один ГОПАТ локально. Итак, давайте создадим один:

mkdir $HOME/gopath

тогда вам нужно установить две переменные среды, чтобы сказать go tool где он может найти существующие пакеты Go и где он должен установить новые. Вероятно, лучше всего добавить следующие две строки в ваш ~/.bashrc или ~/.profile (и не забудьте перезагрузить ваш .bashrc afterwards).

export GOPATH="$HOME/gopath"
export PATH="$GOPATH/bin:$PATH"

2. Создайте новый проект

если вы хотите создать новый проект Go, который должен быть размещен в github.com позже, вы должны создать этот проект под $GOPATH/src/github.com/myname/myproject. Важно, чтобы путь соответствовал URL-адресу github.com РЕПО, потому что инструмент go будет следовать той же Конвенции. Итак, давайте создадим корень проекта и инициализируем там новый репозиторий git:

mkdir -p $GOPATH/src/github.com/myname/myproject
cd $GOPATH/src/github.com/myname/myproject
git init

поскольку мне не нравится вводить такие длинные пути, я обычно создаю символические ссылки для проектов, над которыми я сейчас работаю моя домашняя папка:

ln -s $GOPATH/src/github.com/myname/myproject ~/myproject

3. Напишите свое заявление

начните кодирование и не забудьте git add и git commit ваши файлы. Кроме того, не используйте относительный импорт, как import "./utils" для суб-пакетов. Они в настоящее время недокументированы и не должны использоваться вообще, потому что они не будут работать с инструментом go. Используйте импорт как github.com/myname/myproject/utils вместо.

4. Опубликуйте свой проект

создать новый репозиторий в github.com, загрузите свой открытый ключ SSH, если вы этого не делали раньше, и отправьте свои изменения в удаленный репозиторий:

git remote add origin git@github.com:myname/myproject.git
git push origin master

5. Продолжайте работать над своим проектом

если вы установили ГОПАТ в вашем .bashrc и если вы создали символическую ссылку на ваш проект в вашей домашней папке, вы можете просто ввести cd myproject/ и редактировать некоторые файлы. После этого вы можете зафиксировать изменения с помощью git commit -a и отправить их в github.com делая git push.

вы, вероятно, не хотите две копии источника. После Как написать код Go, у вас должен быть путь, по которому вы делаете свое развитие, скажем "godev", а под ним-каталог "src", а под ним-ваш "github.com/user/project-и ...github.com/user/project/utils (я согласен, это кажется немного жестким, но преимущество, объясненное нам, - это свобода от создания файлов.) Ditch myproject, это где вы будете делать свою работу.

у вас будет GOPATH по крайней мере, установите godev, но вы, вероятно, захотите, чтобы ваш GOPATH начинался с пути для внешних пакетов, которые не являются вашими. Например ГОПАТ я использую это <my place on the file system>/goext:<my place on the file system>/godev.

вы правы, что ваш импорт в основном.иди должен сейчас прочитать "github.com/user/project/utils.

Не беспокойтесь о go get или любой из команд go перезаписи файлов или испортить контроль версий. Через GOPATH они видят, где вы работаете, и они знают, как работает контроль версий.

Если вы хотите сохранить свой код в локальном репозитории версий, просто поместите свой код в GOPATH.

ГОПАТ принимает несколько путей. например. на linux

GOPATH=$HOME/go:$HOME/prj/foo

Итак, вы можете пойти и установить сторонние пакеты в $HOME/go/src/... И, вы можете держать свой код под контролем в $HOME / prj/foo / src.

ref:go help gopath

многие люди говорят, что должны использовать absolutlly путь для построения структуры проекта и импорта:

import "github.com/user/utils"

но это может ограничить ваш проект в рамках одного РЕПО (github). Я хотел бы использовать относительный путь вместо этого:

  import "./utils"

Я не нашел способа сделать это, я поднимаю вопрос здесь: как oraganize GO пакеты проектов, если он будет размещен на разных репозиториях (github & sourceForge)