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

问题描述

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

根据我在StackOverflow(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

,然后检查实际设置的环境变量并启动编译器: 环保 [path ..] \ 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.',mb@R_654_4045@ion,MB_OK);
        Abort;
    end;
end;

这有什么问题?如何在[设置]和[代码]部分中正确捕获环境变量?

解决方法

根据https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/,结果是:

  • Windows环境var在WSL shell中不可用

  • 我运行的是Windows 10 [版本10.0.17134.1488](发布时间为17063),因此,我需要通过导出WSLENV(其值是要公开的envvar的组合)向Windows公开Windows环境变量一个标志(请参阅链接):

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

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

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