Задайте променлива на средата за процеса преди стартиране

Имам следната ситуация:

Имам пакет Mac OS с приложение, което използва някои динамични библиотеки на трети страни и тези библиотеки зависят от някаква променлива на средата, нека я наречем ENV_VAR. Искам да задам ENV_VAR на някаква стойност за моето приложение само защото, ако го задам за цялата система, това може да повреди някои други приложения. И трябва да работи прозрачно за потребителя, т.е. той просто стартира приложението ми от папката Application, като щракне два пъти върху него. Как мога да го постигна?

ЗАБЕЛЕЖКА: динамичните библиотеки се зареждат преди стартирането на главните функции, следователно настройката на тази променлива в основната не помага.


person ixSci    schedule 24.04.2013    source източник


Отговори (2)


Можете да добавите ключ "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.

person Ken Thomases    schedule 24.04.2013
comment
Страхотно обяснение! Прекарах повече от 2 часа, опитвайки се да разбера защо двойките ключ-стойност, които добавих към Info.plist, няма да бъдат зададени от Launch Services. - person nawK; 08.12.2018

Не съм сигурен дали следното работи, защото нямам такова приложение, което да опитам. Идеята е да зададете променливата на средата от терминала, след което да извикате вашето приложение:

ENV_VAR=something open -a YourApplication
person Hai Vu    schedule 24.04.2013
comment
Идеята ти е абсолютно правилна. Но проблемът е как да го интегрираме в пакета. - person ixSci; 24.04.2013
comment
Съжалявам, че не мога да ви помогна там. Може би трябва да опитате apple.stackexchange.com - person Hai Vu; 24.04.2013