私は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
ですが、私はGOPATH
にsrc/myapp/common
をコピーして、そのパッケージに対するgo build -buildmode=plugin
でプラグインを構築します。 myapp
からこれらのプラグインをロードすると、myapp/common
の2つのバージョンが異なるとみなされますが、唯一の違いはサーバー上の場所です。
これで、共通のパッケージを別のプロジェクトに分けて、どちらも独立したプロジェクトを参照するのが正しいでしょうか?それは理にかなっている。後で新しいマシンに移動した場合でも、元のマシンでメインアプリケーションがコンパイルされた状態で正常に動作しますか? –
はい、共通のパッケージを安定したインポートURLに保つことです。別のパッケージとして別のURLが表示されます。だからそれを修正し、それは正常に動作するはずです。別のプロジェクトの場合は、それをプラグインなどと呼ぶことができ、プラグインの機能をサポートするようにすることができます。また、ビルド方法を説明するreadmeもあります。 –
Gotcha!私はそれを試みました、そして、それは私の問題を解決するようです。とても有難い。 –