我已经制作了一个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”命令而不是设置环境变量的那个,我认为问题将会解决。但我仍然找不到办法。
感谢。
答案 0 :(得分:2)
NSIS没有任何线程。显然不是真的 - 但在你自己的代码中,你不能使用线程。
您可能需要为当前进程设置PATH;我不熟悉$ {EnvVarUpdate},但查看它的脚本似乎并不更新当前进程中的变量。试试这个:
${EnvVarUpdate} $0 PATH A HKLM "${JRubyBinPath}" # The line you already have
System::Call Kernel32::SetEnvironmentVariable(t"PATH",tr0)
另一个注意事项:你正在对JRubyBinPath进行硬编码;你确定真的想要这样做吗?