Подтвердить что ты не робот

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

Мне сложно понять рабочий процесс для создания проекта go, в котором есть локальные пакеты.

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

/myproject/
   main.go
   utils/
     tools.go

main.go выглядит следующим образом:

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

и tools.go выглядит следующим образом:

package utils;
func DoSomething() {
}

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

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

4b9b3361

Ответ 1

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

1. Настройте свой GOPATH

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

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

Но если вы одновременно работаете над множеством разных проектов Go, его, вероятно, достаточно, чтобы иметь только один GOPATH локально. Итак, позвольте создать один:

mkdir $HOME/gopath

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

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 [email protected]:myname/myproject.git
git push origin master

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

Если вы установили GOPATH в свой .bashrc, и если вы создали символическую ссылку на свой проект в своей домашней папке, вы можете просто набрать cd myproject/ и отредактировать некоторые файлы там. Впоследствии вы можете зафиксировать изменения с помощью git commit -a и отправить их в github.com, выполнив git push.

Ответ 2

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

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

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

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

Ответ 3

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

GOPATH принимает несколько путей. например. на linux

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

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

ref: go help gopath