68

ローカルパッケージを持つgoプロジェクトを作成するためのワークフローを理解するのに問題があります。

バージョン管理にgitを使用して新しいプロジェクトを作成するとします。このプロジェクトには、main.goファイルとパッケージutilsに含まれるtools.goファイルがあります。だから私はこのようなディレクトリ構造を持っています:

/myproject/
   main.go
   utils/
     tools.go

main.goは次のようになります。

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

およびtools.goは次のようになります。

package utils;
func DoSomething() {
}

gobuildとgorunを使用すると、すべてがローカルで正常に機能します。しかし、これはgithubでホストされているので、他の人にgogetコマンドを使用してインストールしてもらいたいと思います。したがって、ローカルパッケージのインポートを「github.com/user/project/utils」の形式を使用するように変更する必要があります。これは、ソースコードのコピーが2つあることを除いて機能します。実際の問題は、git履歴のあるコピーです。ダウンロードしたコピーを利用するインポートがあります。したがって、git履歴を使用してコピーで作業している場合、tools.goに加えられた変更は、ダウンロードされたコピーを使用するため、気付かれません。

したがって、同じプロジェクト内でgo get、バージョン管理、およびパッケージのインポートを使用する正しい方法を誰かが説明できるかどうか疑問に思っています。

4

5 に答える 5

96

新しいgoツールgithub.comの使用方法に関する簡単なステップバイステップガイドを作成しました。あなたはそれが役に立つと思うかもしれません:

1.GOPATHを設定します

環境変数GOPATHは、任意のディレクトリに設定できます。大規模なプロジェクトがある場合は、プロジェクトごとに異なるGOPATHを作成することをお勧めします。プロジェクトAのライブラリを更新しても、まったく同じライブラリの以前のバージョンが必要になる可能性があるプロジェクトBが破損しないように、このアプローチを特に展開に推奨します。

また、GOPATHをコロンで区切られたディレクトリのリストに設定できることにも注意してください。したがって、一般的に使用されるすべてのパッケージを含むGOPATHがあり、追加のパッケージまたは既存のパッケージの異なるバージョンを使用して、プロジェクトごとに個別のGOPATHを使用している場合があります。

ただし、多くの異なるGoプロジェクトに同時に取り組んでいない限り、ローカルでGOPATHを1つだけ持つだけで十分でしょう。それでは、1つ作成しましょう:

mkdir $HOME/gopath

次に、2つの環境変数を設定して、goツールに既存のGoパッケージを見つけることができる場所と、新しいパッケージをインストールする場所を指示する必要があります。~/.bashrcまたはに次の2行を追加するのがおそらく最善~/.profileです(後で.bashrcをリロードすることを忘れないでください)。

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

2.新しいプロジェクトを作成します

後でgithub.comでホストする必要がある新しいGoプロジェクトを作成する場合は、このプロジェクトをの下に作成する必要があります$GOPATH/src/github.com/myname/myproject。goツールは同じ規則に従うため、パスがgithub.comリポジトリのURLと一致することが重要です。それでは、プロジェクトルートを作成し、そこで新しい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 addgit 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にGOPATHを設定し、ホームフォルダーにプロジェクトへのシンボリックリンクを作成した場合は、cd myproject/そこにいくつかのファイルを入力して編集するだけです。その後、を使用して変更をコミットし、を実行してgithub.comgit commit -aに送信できます。git push

于 2012-04-13T14:05:19.863 に答える
10

ソースの2つのコピーはおそらく必要ありません。Goコードの書き方に続いて、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 getやgoコマンドのいずれかがファイルを上書きしたり、バージョン管理を台無しにしたりすることを心配する必要はありません。GOPATHを通じて、彼らはあなたがどこで作業しているかを確認し、バージョン管理がどのように機能するかを知っています。

于 2012-04-12T20:32:14.317 に答える
8

コードをローカルバージョンのリポジトリに保持する場合は、コードをGOPATHに配置するだけです。

GOPATHは複数のパスを受け入れます。例えば。Linuxの場合

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

したがって、サードパーティのパッケージを$ HOME / go / src / ...にインストールして、コードを$ HOME / prj / foo/srcで制御し続けることができます。

参照:go help gopath

于 2012-05-05T05:19:20.150 に答える
-2

多くの人が、プロジェクトの構造体を構築してインポートするために絶対パスを使用する必要があると言います。

import "github.com/user/utils"

ただし、これにより、単一のリポジトリ(github)内でプロジェクトが制限される場合があります。代わりに相対パスを使用したい:

  import "./utils"

私はそれを行う方法を見つけられませんでした、私はここで質問を提起します: それが異なるリポジトリ(github&sourceForge)でホストされる場合、GOプロジェクトパッケージを整理する方法

于 2018-07-19T02:03:40.707 に答える
-2

さまざまな投稿やGoのドキュメントでこの回答を探した後、Go 1.11では、パッケージを処理するための新しいアプローチがリリースされ、Goモジュールを使用しています。

Goモジュールに関する一連の投稿全体をここで読んでください。

Go Modulesは、バージョン管理も行います

于 2020-04-23T14:05:01.457 に答える