1

私のプロジェクトには、/usr/share/openageさまざまなファイル (グラフィック、テキストなど) を含むグローバル アセット ディレクトリ ( ) と、ユーザー~/.openageがグローバル アセットの一部を上書きしたり、独自のアセットを追加したりできるユーザー固有のアセット ディレクトリ ( ) があります。

ビルド時にインストール プレフィックスをビルド システム (例: ) に渡すと、コード (例: ) でインストール プレフィックスを使用できるようにする./configure --install-prefix=/usrファイル (例: ) が生成されると理解しています。次に、コードは でそのアセットを探します。ここまでは順調ですね。configure.h#define INSTALL_PREFIX="/usr"INSTALL_PREFIX "share/openage"

ただし、プロジェクトがまだインストールされていない場合 (開発者である私にとっては 99.9% の場合に当てはまります)、ディレクトリ/usr/share/openageは明らかにまだ存在しません。./assets代わりに、現在のディレクトリで使用したいと思います。さらに悪いことに、インストールされたディレクトリが存在する場合(たとえば、独立した以前のインストールから)、現在の開発バージョンとデータの互換性がない可能性があります。

同様に、インストールされたプロジェクトを実行する場合、ユーザーのホーム ディレクトリ ( ~/.openage) をユーザー アセット ディレクトリとして使用し、"devmode" では "./userassets" のようなディレクトリを使用する必要があります。

非 POSIX プラットフォームについて考えると、さらに悪化します。Windows では、INSTALL_PREFIXプログラムは基本的にどこにでもインストールできるため (プログラムは単純に現在の作業ディレクトリを使用するのか、それともアセット ディレクトリとして使用するのか?)、役に立ちません。

だから私の質問は:一般的に受け入れられている「これを行うための最良の方法」はありますか?確かに、何百ものプロジェクト (基本的にはアセット ディレクトリを持つすべてのプロジェクト) が、何らかの方法でこの問題に対処してきました。

残念ながら、何をグーグルで検索すればよいかさえわかりません。この質問にタグを付ける方法さえわかりません。現在のアイデア (および関連する問題) には、次のものが含まれます。

  • openage_versionで、ソース ディレクトリにのみ存在するファイル を探していますcwd。存在する場合は、プロジェクトが現在アンインストールされていると想定します。
    • 問題: 「開発モード」であっても、cwd常にプロジェクトのルート ディレクトリであるとは限りません。
  • readlink("/proc/self/exe")で始まるかどうかを確認するINSTALL_PREFIX
    • 問題: プラットフォーム固有
    • 問題: 理論的には、プロジェクトのルート ディレクトリは/usr/myweirdhomedirectory/git/openage
  • 開発者に引数の指定--not-installedや環境変数の設定を強制するOPENAGE_INSTALLED=0
    • 問題点: 不便
    • 問題: 引数の指定を忘れると、間違ったアセット ディレクトリが使用されたときに混乱が生じる
  • 開発中./configure、別のINSTALL_PREFIX
    • 問題: インストール用にプロジェクトをビルドすると、プロジェクトがインストールされていないときに、推奨make testされるテストが実行されます。
  • 最初の 2 つのオプションの組み合わせ:dirname(readlink("proc/self/exe")) + "/openage_version"
    • 問題: さらにプラットフォーム固有
    • これは、これまでのところ最も堅牢なオプションのようです
4

1 に答える 1

1

私が最終的に選択した解決策は、アプリケーションの Python 部分で決定を行うことです。

中にインストールされbuildsystem.setupないpython モジュールがありますmake install

この事実を使って、私は簡単に

def is_in_devmode():
    try:
        import ..buildsystem.setup
        return True
    except ImportError:
        return False
于 2015-05-08T13:13:10.853 に答える