NSIS - jruby не может получить доступ к переменным окружения - PullRequest
3 голосов
/ 11 августа 2011

Я создал скрипт NSIS для создания установщика для приложения Rails.Приложение использует JRuby и Java.

В первом разделе установщика я устанавливаю переменные среды: я добавляю jruby \ bin в PATH и создаю переменную JAVA_HOME, которая указывает на Java \ jre6.

!define JRubyBinPath "$PROGRAMFILES\${PRODUCT_PUBLISHER}\JRuby\jruby-1.6.3\bin"

Function SetEnvVars    
    # set JAVA_HOME
    ${EnvVarUpdate} $0 "JAVA_HOME" "A" "HKCU" "C:\Program Files\Java\jre6"  
    # add jruby to Path
    ${EnvVarUpdate} $0 "Path" "A" "HKLM" "${JRubyBinPath}"          
FunctionEnd

Section "Pre" SEC01     
    Call SetEnvVars 
    ...
SectionEnd

** Все пути верны.**

Во втором разделе программы установки после упаковки всех файлов приложений и файлов JRuby я инициализирую базу данных с помощью следующих команд:

Section "Installer" SEC02

...

    SetOutPath $INSTDIR
    nsExec::ExecToLog "jruby -S bundle exec rake db:create RAILS_ENV=production"
    nsExec::ExecToLog "jruby -S bundle exec rake db:migrate RAILS_ENV=production"
    nsExec::ExecToLog "jruby -S bundle exec rake db:seed RAILS_ENV=production"      

...

SectionEnd

Проблема заключается в том, чточто когда я запускаю установщик в чистой системе Windows, весь код выполняется правильно, за исключением строк, которые содержат команды, использующие «jruby».Я не получаю сообщение об ошибке в окне установщика, оно просто не выполнит эти строки.

В любом случае, если я выполню эти команды вручную в консоли сразу после завершения установки, все будет работать, как и ожидалось.

Из того, что я видел до сих пор, проблема в том, что установщик не может получить доступ к переменным окружения, пока он не завершит работу.

* То, что я до сих пор делал для решения этой проблемы, - это создание основного установщика Installer.exe (здесь я упаковываю все файлы и задаю переменные среды) и другого исполняемого файла Init.exe, который инициализирует базу данных.Если я вручную запускаю эти исполняемые файлы - сначала Installer.exe, затем Init.exe - приложение устанавливается правильно.Но если я попытаюсь запустить Init.exe из Installer.exe, он не будет работать.

Однако, если бы был способ выполнить команды "jruby" в новом / отличном от потока потоке, который устанавливает переменные окружения, я думаю, что проблема будет решена.Но я все еще не мог найти способ сделать это.

Спасибо.

1 Ответ

2 голосов
/ 11 августа 2011

В NSIS нет потоков. Очевидно, это не совсем так - но в вашем собственном коде вы не можете использовать потоки.

Возможно, вам потребуется установить PATH для текущего процесса; Я не знаком с $ {EnvVarUpdate}, но, глядя на его скрипт, он, похоже, не обновляет переменную в текущем процессе. Попробуйте это:

${EnvVarUpdate} $0 PATH A HKLM "${JRubyBinPath}"  # The line you already have
System::Call Kernel32::SetEnvironmentVariable(t"PATH",tr0)

Еще одно замечание: вы жестко программируете JRubyBinPath; Вы уверены, что действительно хотите это сделать?

...