我的项目有一个包含各种文件(图形,文本等)的全局资产目录(/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毫无用处,因为程序基本上可以安装在任何地方(程序是否仅使用当前工作目录还是作为资产目录?),而且我对Mac如何处理这一点一无所知。

所以我的问题是:是否有一个公认的“最佳方法”?当然,数百个项目(基本上是每个具有资产目录的项目)已经以一种或另一种方式处理了此问题。

不幸的是,我什至不知道该怎么做。我什至不知道如何标记这个问题。
当前的想法(和相关问题)包括:

  • openage_version中寻找仅存在于源目录中的文件cwd。如果存在,则假定该项目当前已卸载。
  • 问题:即使在“开发模式”下,cwd可能也不一定总是项目的根目录。
  • 检查readlink("/proc/self/exe")是否以INSTALL_PREFIX开头
  • 问题:特定于平台的
  • 问题:理论上,项目根目录可能位于/usr/myweirdhomedirectory/git/openage

  • 强制开发人员指定参数--not-installed或设置环境变量OPENAGE_INSTALLED=0
  • 问题:
  • 不方便
  • 问题:如果使用了错误的资产目录,则忘记指定参数会导致混乱
  • 在开发过程中,请使用其他./configure调用INSTALL_PREFIX
  • 问题:构建要安装的项目时,建议的make test将在未安装项目的情况下运行测试
  • 前两个选项的组合:检查dirname(readlink("proc/self/exe")) + "/openage_version"
  • 问题:更多特定于平台的
  • 这似乎是迄今为止最强大的选项
  • 最佳答案

    我最终选择的解决方案是在应用程序的Python部分进行决策。

    有一个Python模块buildsystem.setup,它在make install期间未安装而不是

    利用这个事实,我可以简单地

    def is_in_devmode():
        try:
            import ..buildsystem.setup
            return True
        except ImportError:
            return False
    

    10-08 04:55