【问题标题】:NSIS: Reading from a file at compile timeNSIS:在编译时从文件中读取
【发布时间】:2013-03-20 07:11:24
【问题描述】:

当我编译我的 nsis 脚本时,我想将文件 (config.json) 中的一些值读取到一些变量中。 我怎么可能这样做?

提前致谢。

【问题讨论】:

  • 为什么要这样做?给我们举个例子。也许您可以使用某种构建机制替换这些值,例如ant
  • 我只想在编译时从配置文件中读取值并将其嵌入到 exe 中,这样我的 exe 就不会依赖于某些外部配置文件。
  • 必须是 JSON 吗?您不能将其安排为 NSIS 头文件(.nsh,包含 !define XYZ ABC 之类的内容)或将它们传递给编译器(makensis /DXYZ=ABC)吗?或者您是否有其他已经在使用的语言(例如 Python)可以用来实现这一目标?
  • @ChrisMorgan json 文件是我正在做的事情的首选。不,我没有使用任何其他语言,只是 nsis。

标签: nsis compile-time


【解决方案1】:

!include 命令可以包含任何文件(在编译时)放置在 nsis 脚本中的位置。但包含的文件必须符合 nsis 语法(例如,它应该 !define 一些值)。

!execute 命令可以帮助您:如果您绝对需要处理 json 文件,您可以编写第三方批处理命令文件来预处理 json 文件并将其转换为合适的 nsis 文件。

【讨论】:

  • 我现在正在做的事情与此类似。我正在制作一个 readconfig.exe (并在编译时使用 !execute 从脚本执行它)从 config.json 读取工作并写入 config.nsh ,我将其包含在我的原始 nsis 脚本中。但是在这种方法中,我必须使用我不想要的额外config.exe。所以,寻找其他更好的选择。
  • @smilepleeeaz:嗯,这和你能得到的一样好。
【解决方案2】:

您可以使用!define 传递一些可在编译时使用的值。例如,假设您在 nsis 源文件中有此代码:

!define PATHTOFILE "C:\thisfilewillbedeleted.ext"
Delete $PATHTOFILE

如果你想在编译时改变这个值,你可以这样调用 nsis:

makensis /DPATHTOFILE="C:\otherfiletodelete.ext"

[编辑]

如果你有使用外部工具生成的 *.json 文件并且你必须使用这种文件,我会建议你使用一些构建系统,例如ant。您可以创建build.xml,它从 json 文件读取、解析数据,然后将这些数据写入*.nsh 文件。我认为它会比在 nsis 脚本中做的更好更干净。

【讨论】:

  • 如果这个对你有帮助,你应该检查它是否有帮助;)
【解决方案3】:

如果您只需要在运行时解析 json 文件,您可以使用 !define/file 选项:

!define /file OPTIONS json.txt

它将使用 json.txt 的内容定义 OPTIONS。

如果您想在编译时利用您的 json 文件来更改生成的 exe,那么您需要某种预编译器,这就是您实际在做的事情。

【讨论】:

    【解决方案4】:

    您可以使用带有 /file 开关的 !searchparse 命令。

    例子:

    # 在 filename.cpp 中搜索“#define APP_VERSION "2.5"' 行并将 ${VER_MAJOR} 设置为 2,将 ${VER_MINOR} 设置为 5。

    !searchparse /file filename.cpp `#define APP_VERSION "` VER_MAJOR `.` VER_MINOR `"`

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      相关资源
      最近更新 更多