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

makensis在unix上给出的错误与在windows上工作的脚本完全相同,nsis,Nsis,我编写了一个NSIS安装程序脚本,它可以在Windows上很好地构建,但是我也需要它在*nix操作系统上构建。当我在OS X上运行它时,我得到以下错误 Usage: !define ([/date|/utcdate] symbol [value]) | (/file symbol filename) | (/math symbol val1 OP val2) OP=(+ - * / % & | ^) Error in script "/Users/john/Development

我编写了一个NSIS安装程序脚本,它可以在Windows上很好地构建,但是我也需要它在*nix操作系统上构建。当我在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 bar 'BAR" "oops'
!define foo "${bar}\baz" ; Expands to !define foo "BAR" "oops\baz"
我假设问题与如何在命令行上使用-D来设置PROJECT_DIR有关。您不应该引用值部分(本例中的路径),而应该引用整个名称=值部分。这是由C库实现控制的,它负责将命令行拆分为各个参数(并可能删除引号)。官方NSIS Windows构建使用Visual C++,它是相当宽容的,至少允许这5个变体:

  • makensis“-Dname=value”setup.nsi
  • makensis-“Dname=value”setup.nsi
  • makensis-D“name=value”setup.nsi
  • makensis“-Dname=“value”setup.nsi
  • makensis-D“name=”value“setup.nsi
  • …所有这些都应该显示出来

    定义的命令行:“名称=值”

    因为微软的实现有一些疯狂的报价处理


    添加
    !警告“>${PROJECT_DIR}可能会使用正向斜杠?反向斜杠应该不会有问题。了解PROJECT_DIR常量的内容会很有意思。我对该行的版本没有问题,在OS X(MakeNSIS v12-Mar-2015.cvs)上编译时,PROJECT DIR和其他常量是..命令行定义的:“PROJECT_DIR=“/Users/john/Development/java/vordio”命令行定义:“PROJECT\u BUILD\u DIR=“/Users/john/Development/java/vordio/target”命令行定义:“PROJECT\u VERSION=“4.3.3”您可能应该在内部或外部使用不同的引号,例如“PROJECT\u DIR=“/Users/john/Development/java/vordio”我做的第一件事就是去掉所有的引语,它就成功了。我现在意识到,无论如何,引号可能是不必要的,因为makensis是由构建工具使用数组调用的,而不是通过命令行调用的。我不认为空间会影响它。