makensis 在 unix 上使用与 windows 上完全相同的脚本给出错误

makensis gives error on unix with exact same script that works on windows

我写了一个在 Windows 上构建良好的 NSIS 安装程序脚本,但是我也需要它在 *nix OSes 上构建。当我 运行 它在 OS X 上时,我得到以下错误..

Usage: !define ([/date|/utcdate] symbol [value]) | (/file symbol filename) | (/math symbol val1 OP val2)
    OP=(+ - * / % & | ^)
Error in script "/Users/john/Development/java/vordio/src/main/app-resources/win-installer.nsi" on line 6 -- aborting creation process

这是失败的脚本行..

 !define VORDIO_ICON "${PROJECT_DIR}\src\main\app-resources\vordio_logo_64x64_win_icon.ico"

我看不出有什么问题,但我尝试添加 /file 没有帮助,也没有更改文件路径分隔符。

有人遇到过这个 NSIS 问题吗?

如果传递的参数过多,

!define 将打印该错误。如果引号提前终止字符串,就会发生这种情况:

!define bar 'BAR" "oops'
!define foo "${bar}\baz" ; Expands to !define foo "BAR" "oops\baz"

我认为问题与您如何在命令行上使用 -D 来设置 PROJECT_DIR 有关。您不应该引用值部分(在您的情况下是路径),您应该引用整个 name=value 部分。你如何做到这一点由 C 库实现控制,它负责将命令行拆分为单独的参数(并可能删除引号)。官方 NSIS Windows 构建使用 Visual C++,它非常宽容并且至少允许以下 5 种变体:

  1. makensis "-Dname=value" setup.nsi
  2. makensis -"Dname=value" setup.nsi
  3. makensis -D"name=value" setup.nsi
  4. makensis "-Dname="value"" setup.nsi
  5. makensis -D"name="value"" setup.nsi

...所有这些都应该显示

Command line defined: "name=value"

因为 Microsoft 实现有一些疯狂的引用处理。

!warning ">${PROJECT_DIR}<" 添加到您的脚本并更改您调用 makensis 的方式,直到尖括号之间没有引号...