【问题标题】:Set environment variable for the process before startup启动前为进程设置环境变量
【发布时间】:2013-04-17 13:29:43
【问题描述】:

我有以下情况:

我有 Mac OS 捆绑应用程序,它使用一些 3rd 方动态库,这些库依赖于一些环境变量,我们将其命名为 ENV_VAR。我只想为我的应用程序将ENV_VAR 设置为某个值,因为如果我为整个系统设置它可能会破坏其他一些应用程序。它应该对用户透明地工作,即他只需通过双击从应用程序文件夹运行我的应用程序。我怎样才能实现它?

注意:动态库是在主函数启动之前加载的,因此在主函数中设置这个变量没有帮助。

【问题讨论】:

    标签: macos bash shell applescript


    【解决方案1】:

    您可以将key "LSEnvironment" 添加到您的应用程序包的 Info.plist。该值可以是一个包含键和值字符串的字典,当您的应用由 Launch Services 启动时(例如,从 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 构建应用程序,它应该不会影响您。

    【讨论】:

    • 很好的解释!我花了 2 多个小时试图弄清楚为什么我添加到 Info.plist 的键值对不会被 Launch Services 设置。
    【解决方案2】:

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

    ENV_VAR=something open -a YourApplication
    

    【讨论】:

    • 你的想法是绝对正确的。但问题是如何将它集成到包中。
    • 很抱歉,我无法为您提供帮助。也许你应该试试apple.stackexchange.com
    猜你喜欢
    • 2013-01-11
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多