3

ファイル テンプレートを管理するフォルダーを含むプロジェクトがありますが、Go が非 Go コード プロジェクト ファイルをサポートしているようには見えません。プロジェクト自体は実行可能ファイルにコンパイルされますが、正しく動作するためには、このテンプレート フォルダーがどこにあるかを知る必要があります。現在、$GOPATH/src/<templates>/templates を検索していますが、パッケージの名前を変更したり、別の場所でホストしたりすると壊れてしまうので、これは一種のハックのように感じます。

いくつかの検索を行ったところ、最終的なバイナリにアセット ファイルを埋め込むことでアセット ファイルを「コンパイル」できることに多くの人が興味を持っているようですが、このアプローチについてどのように感じているかはわかりません。

何か案は?

4

2 に答える 2

2

ユーザーがサポート データを配置するパス (またはパスのリスト) を選択するか (/usr/local/share/myapp など)、バイナリにコンパイルします。

プログラムの配布方法によって異なります。パッケージとして?インストーラーで?

私のプログラムのほとんどは、デプロイするファイルが 1 つだけであることが好きで、含めるテンプレートがいくつかあるだけなので、そうしています。

Makefile を使用して html テンプレートをビルドするgo-bindataを使用した例がありますが、「devel」フラグを使用してビルドすると、代わりに実行時にファイルが読み込まれ、開発が容易になります。

于 2013-07-09T20:03:25.587 に答える
1

cwdフラグを使用するか、cwd と arg 0 から推論するかの 2 つのオプションを考えることができます。

-cwd パス/へ/アセット

path/to/exe -cwd=$(path/to/exe/assets)

内部的には、実行可能ファイルは cwd が指す場所に chdir し、アプリケーション全体で相対パスを使用できます。これには、ユーザーがプログラムを再コンパイルすることなくアセットを変更できるという追加の利点があります。

これは構成ファイルに対して行います。基本的には次の順序になります。

  • -cwd 変数を探して cmd 引数を処理します (デフォルトは空です)。
  • chdir から -cwd
  • 設定ファイルをパースする
  • コマンド引数を再解析し、構成ファイルの設定を上書きします

アプリにいくつの引数があるかはわかりませんが、特に Go にはこれらのアセットをコンパイルする標準のパッケージング ツールがないため、これは非常に便利であることがわかりました。

引数 0 から推測

もう 1 つのオプションは、最初の引数を使用して、実行可能ファイルへのパスを取得することです。このようなもの:

here := path.Dir(os.Args[0])
if !path.IsAbs(os.Args[0]) {
    here = path.Join(os.Getwd(), here)
}

これにより、実行可能ファイルの場所へのパスが取得されます。ユーザーが残りのアセットを移動せずにこれを移動しないことが保証されている場合は、これを使用できますが、上記の -cwd のアイデアを使用する方がはるかに柔軟であることがわかります。彼らのシステムとそれを資産に向けるだけです。

最良の選択肢は、おそらく 2 つの組み合わせです。ユーザーが -cwd フラグを指定しない場合、おそらく何も移動していないため、arg 0 と cwd から推測します。cwd フラグはこれをオーバーライドします。

于 2013-07-10T00:13:39.200 に答える