如何为 [Setup] AppVersion 使用编译时环境变量?

Posted

技术标签:

【中文标题】如何为 [Setup] AppVersion 使用编译时环境变量?【英文标题】:How to use compile-time environment variables for [Setup] AppVersion? 【发布时间】:2020-12-18 02:28:18 【问题描述】:

我正在使用 InnoSetup 6(Windows 10、Visual Studio Code 和 WSL 作为我的 shell)来创建安装程序。这个 ISCC 编译器是从一个自动化脚本中调用的。该脚本负责设置包含生成的安装程序版本和生成的安装程序名称的环境变量。它们都旨在用于脚本调用的 InnoSetup 安装程序编译器 (iscc.exe)。 我使用 envvars 是因为我不想用硬连线的版本号弄乱我的 ISS 文件。

根据 *** (Can one use environment variables in Inno Setup scripts?) 上的这个问题,我认为在 Innosetup 中可以使用环境变量。

不幸的是,Innosetup 向"The [Setup] section must include an AppVersion or AppVerName directive." 投诉。就像GetEnv() 产生一个空字符串一样。

我尝试像这样从命令行手动调用 ISCC:

export JFROG_DEFAULTGROUPS_VERSION=1.0.0-1 && [path..]\iscc.exe myiss.iss

甚至使用export 导出环境变量:

export JFROG_DEFAULTGROUPS_VERSION=1.0.0-1

,然后检查环境变量是否实际设置并启动编译器: 环境 [路径..]\iscc.exe myiss.iss

在这种情况下,env 产生以下结果:

JFROG_DEFAULTGROUPS_VERSION=1.0.0-1
SHELL=/bin/bash
PATH=[...]
[...]

这让我觉得根据我的 shell (WSL) 设置了环境。但两者都没有给出更好的结果。

我的 ISS 文件如下:

#define MyInstName "MyApp"
#define MyInstVersion GetEnv("JFROG_DEFAULTGROUPS_VERSION")

[Setup]
AppName=#MyInstName
AppVersion=#MyInstVersion

DefaultGroupName=#MyInstName
OutputBaseFilename=MyApp_#MyInstVersion_setup
AppendDefaultDirName=no
DefaultDirName=commonpf

[Components]
Name: default_groups_conf; Description: Default Groups Configuration; Types: full


[Run]

[Code]
function InitializeSetup(): Boolean;
begin
    if not ('#MyInstVersion' = '') then begin
        MsgBox('MyInstVersion Env Var not set.', mbInformation, MB_OK);
        Abort;
    end;
end;

这有什么问题?如何正确捕获 [Setup] 和 [Code] 部分中的环境变量?

【问题讨论】:

编译你的脚本在第一行就失败了,"Undeclared identifier: "MyApp"." 没错。 – 假设这只是一个错误,而您正在清理脚本。而实际的脚本更像#define MyInstName "MyApp"。然后脚本会做它应该做的事情。当我使用以下行从批处理文件编译它时,它工作得很好:1)set JFROG_DEFAULTGROUPS_VERSION=2.1.4 2)ISCC.exe Example1.iss – 什么是export? Windows 批处理文件中没有导出命令,PowerShell 中也没有。你在 Windows 上使用 *nix shell 吗? 这看起来不像是 Inno Setup 问题。更有可能是您实际上没有正确设置环境变量。 @MartinPrikryl,谢谢!我修复了示例代码,它确实是一个清理错误。是的,我的目标是 WSL。在成功调用 ISCC 之前从终端列出环境变量(env 命令)会显示环境变量,因此看起来它设置正确(根据 WSL),但 InnoSetup 出于任何原因可能无法理解。刚刚从 Windows 命令行解释器尝试过:完美无缺。使用 WSL 而不是 Inno Setup 标记此问题。谢谢! @MartinPrikryl,感谢您为我指明了正确的方向。我读到了这个:devblogs.microsoft.com/commandline/…,让事情变得更清楚了! 【参考方案1】:

根据https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/,事实证明:

Windows 环境变量在 WSL shell 中不可用

我运行 Windows 10 [版本 10.0.17134.1488],它是 17063 之后的版本,因此,我需要通过导出一个 WSLENV 来向 WSL 公开 Windows 环境变量,该 WSLENV 的值是要公开的 envvar 的组合,加上一个标志 (见链接):

导出 JFROG_DEFAULTGROUPS_VERSION=1.0.0-1 导出 WSLENV=JFROG_DEFAULTGROUPS_VERSION/w

然后,JFROG_DEFAULTGROUPS_VERSION envvar 可以被 ISCC 读取。

结论:谨慎使用 WSL1 和环境变量。

【讨论】:

【参考方案2】:

我通过以下步骤实现了这一点。请注意,我使用 git-bash shell 执行了 iscc。在 git-bash shell 中,我定义环境变量并使用“export ”命令公开它们,以便 iscc 可以获得它的值

1. In .iss file, I have added following environment variables using #define

    #define XXXAppVersion GetEnv('XXX_VERSION')
    #define YYYRootDir GetEnv('YYY_ROOR_DIR')

2. use these in `[Setup]` section of .iss file

    AppVersion=#XXXAppVersion 
    OutputDir=#YYYRootDir/bin

3. After these changes, open git-bash shell and define these environment variables as follows

export XXX_VERSION="4.0.0.1"
export YYY_ROOT_DIR="C:\YYY_Home"

4. then execute following iscc using .iss file as follows in same shell which executes successfully. 

    iscc.exe "<.iss file>"

【讨论】:

以上是关于如何为 [Setup] AppVersion 使用编译时环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中自动播放安装 CD 时,如何为 setup.exe 指定发布者

如何为基本包设置配置 __main__.py、__init__.py 和 __setup__.py?

如何为 Wix 刻录引导程序 exepackage 添加依赖文件夹

如何为 UIView 添加圆角半径

如何为 Python 2 和 3 上传通用 Python Wheel?

如何为 lint 和运行测试的拉取请求编写管道