2017-11-28 11 views
0

私はGoの専門家ではないので、私はGoの理想的な方法ではない方法でこれを実行している可能性があります。基本的に、私はそれのために書かれたプラグインを持つことができる必要がある主なアプリケーションを持っています。プラグインはすべて指定のフォーマットに準拠しており、go build -buildmode=pluginで構築されています。エンドユーザが毎回メインアプリケーションを再コンパイルする必要はありません。理想的には、それを問題なく新しいコンピュータにドラッグアンドドロップできるはずです。プラグインとメインアプリケーションの間のGolangパッケージのバージョン

プラグインとアプリケーションの間で情報をやりとりするために、Cヘッダーファイルと同様に扱われる「共通」という第3のパッケージが定義されています。両方のインタフェースが使用できるインタフェースといくつかの整数定数のみを定義します。アプリケーションは、インターフェイスに準拠したタイプを生成し、プラグインに渡して使用することができます。

私がコンパイルすると、うまくいくように見え、アプリケーションはplugin.Openを使ってプラグインをロードできます。キャッチはcommonパッケージの場所を移動しようとしたときに発生します。ローカルのディレクトリに元のアプリケーションを構築し、アプリケーションをインストールするスクリプトを用意して、commonパッケージをGOPATHにコピーして見つけます。今、プラグインを作成して、commonパッケージのグローバルコピーを参照してコンパイルしようとすると、パッケージの2回の出現が異なるバージョンであることがわかるため、メインアプリケーションでロードできません。

私の理解では、パッケージのバージョンを決定するために、コンパイル時にパッケージ内のすべてのGoファイルがハッシュされます。このハッシュは、パッケージが見つかったサーバー上の場所も含めていますか?

実際のパッケージのバージョンが同一であることは分かっています。唯一の違いは私がcp -r src/myapp /usr/local/go/srcをしたことです。これを実現するためのよりよい方法は、ユーザーが主なアプリケーションを別のマシンに移動させ、再コンパイルする必要がないという私のアプローチよりも優れていますか?

さらなる説明:私はmyappにこれをコンパイルすると

はここに私のディレクトリ構造

./ 
    |-- main.go 
    |-- src/myapp/common 
    |  |-- Common.go 
    |-- install.sh 

ですが、私はGOPATHsrc/myapp/commonをコピーして、そのパッケージに対するgo build -buildmode=pluginでプラグインを構築します。 myappからこれらのプラグインをロードすると、myapp/commonの2つのバージョンが異なるとみなされますが、唯一の違いはサーバー上の場所です。

答えて

1

代わりに、共通パッケージのパスを安定させてみましたか?おそらく、それを自分のリポジトリに入れて(両方のプロジェクトがそれを参照できるように)、またはあなたのアプリケーションリポジトリにそのプラグインを保持することができますが、そこにプラグインをリンクさせる必要があります。

github.com/:あなたは(両方のアプリとプラグインのために)インポートパスを作ることができ

github.com/brianwest/myapp

:例えばだから、

は、プロジェクトが住んで言いますbrianwest/myapp/src/common

または

github。co.jp/brianwest/common

アプリとプラグイン全体で安定した状態にしておくと、正常に動作するはずです。スクリプトをgopathにコピーする必要はありません。また、src/githubに置くこともできます.com/brianwest/commonとプラグインとアプリの両方でそのパスを使用します。

+0

これで、共通のパッケージを別のプロジェクトに分けて、どちらも独立したプロジェクトを参照するのが正しいでしょうか?それは理にかなっている。後で新しいマシンに移動した場合でも、元のマシンでメインアプリケーションがコンパイルされた状態で正常に動作しますか? –

+0

はい、共通のパッケージを安定したインポートURLに保つことです。別のパッケージとして別のURLが表示されます。だからそれを修正し、それは正常に動作するはずです。別のプロジェクトの場合は、それをプラグインなどと呼ぶことができ、プラグインの機能をサポートするようにすることができます。また、ビルド方法を説明するreadmeもあります。 –

+0

Gotcha!私はそれを試みました、そして、それは私の問題を解決するようです。とても有難い。 –

関連する問題