NSIS - jruby无法访问环境变量

时间:2011-08-11 09:20:01

标签: jruby environment-variables nsis

我已经制作了一个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 - 应用程序安装正确。但是,如果我尝试从Installer.exe启动Init.exe,它将无法正常工作。

但是,如果有一种方法在新的/不同的线程中执行“jruby”命令而不是设置环境变量的那个,我认为问题将会解决。但我仍然找不到办法。

感谢。

1 个答案:

答案 0 :(得分:2)

NSIS没有任何线程。显然不是真的 - 但在你自己的代码中,你不能使用线程。

您可能需要为当前进程设置PATH;我不熟悉$ {EnvVarUpdate},但查看它的脚本似乎并不更新当前进程中的变量。试试这个:

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

另一个注意事项:你正在对JRubyBinPath进行硬编码;你确定真的想要这样做吗?