1

I have the following situation:

I have Mac OS bundle with application which uses some 3rd party dynamic libraries and those libraries depend on some environment variable, let's name it ENV_VAR. I want to set ENV_VAR to some value for my application only because if I set it for the whole system it may breaks some other apps. And it should work transparently to the user i.e. he just run my app from the Application folder by double clicking it. How can I achieve it?

NOTE: dynamic libraries are loaded before main functions starts hence setting this variable in the main doesn't help.

4

2 回答 2

8

您可以将密钥“LSEnvironment”添加到应用程序包的 Info.plist。该值可以是一个包含键和值字符串的字典,当您的应用程序由启动服务启动时(例如,从 Finder 或 Dock 但不是从终端),这些键值对将添加到环境中。

<key>LSEnvironment</key>
<dict>
    <key>ENV_VAR</key>
    <string>value</string>
</dict>

然而,在我的测试中(在 Snow Leopard 上),测试起来有点不稳定,至少在编辑现有应用程序的 Info.plist 时是这样。基本上,Launch Services 在首次遇到应用程序时会缓存应用程序的 Info.plist 的这一部分,并且不一定会识别磁盘上的更改。您有时可以提示它重新读取 Info.plist,例如,复制应用程序包或暂时将其移动到不同的文件夹。当然,矫枉过正的解决方案是使用lsregister刷新和重建缓存:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -seed

此缓存问题不会影响您的最终用户,只会影响您调整 Info.plist。此外,如果您在源 Info.plist 中进行更改,然后使用 Xcode 构建应用程序,它应该不会影响您。

于 2013-04-24T10:10:55.250 回答
1

我不确定以下是否有效,因为我没有这样的应用程序可供尝试。这个想法是从终端设置环境变量,然后调用您的应用程序:

ENV_VAR=something open -a YourApplication
于 2013-04-24T06:16:03.007 回答