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这是无用的,因为程序基本上可以安装在任何地方(程序只是使用当前工作目录还是作为资产目录?),我不知道 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"
    • 问题:更加特定于平台
    • 这似乎是迄今为止最强大的选择
4

1 回答 1

1

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

有一个 python模块buildsystem.setupmake install.

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

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