【问题标题】:NSIS - jruby fails to access environment variablesNSIS - jruby 无法访问环境变量
【发布时间】:2011-08-11 09:20:01
【问题描述】:

我制作了一个 NSIS 脚本来为 Rails 应用程序创建安装程序。 该应用程序使用 JRuby 和 Java。

在安装程序的第一部分中,我设置了环境变量:我将 jruby\bin 添加到 PATH 并创建了指向 Java\jre6 的 JAVA_HOME 变量。

!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”命令,而不是设置环境变量的线程,我认为问题将得到解决。但我仍然找不到这样做的方法。

谢谢。

【问题讨论】:

    标签: jruby environment-variables nsis


    【解决方案1】:

    NSIS 没有任何线程。 显然不完全正确——但在您自己的代码中,您不能使用线程。

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

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

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

    【讨论】:

    • 实际上,${JRubyBinPath} 是我在安装应用程序时解压 JRuby 文件的文件夹(我在安装程序中打包 jruby 并安装了所有必要的 gem)。
    • 它与System::Call Kernel32::SetEnvironmentVariable(t"PATH",tr0) 配合得很好。再次感谢。
    • 如果你将 JRuby 放在你的安装目录中,你应该使用$INSTDIR
    • 哦,是的!你说的对。我的脚本中有太多变量,所以我有点搞砸了:|
    • NSIS 线程模型未定义!来自 .onGuiInit 和更高版本的所有回调都将在同一个线程上,但 instfiles 页面上的实际文件提取可能在另一个线程上等...
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 2023-01-08
    • 2021-05-05
    • 2014-07-29
    • 2018-03-17
    • 2016-04-15
    • 2021-04-23
    • 2010-11-07
    相关资源
    最近更新 更多