Inno Setup:更改YAML文件中的值

时间:2018-10-30 12:56:10

标签: yaml inno-setup

我为Inno Setup创建了一个ISS文件来安装软件,并且有一个YAML配置文件,需要在安装过程中更改其中的值。

我是Inno Setup的新手,我没有Pascal的经验,所以我环顾四周,发现了如何打开和更改文本文件或JSON,但不是YAML,我不知道它们是否相同。

我的ISS文件是:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "MyApp"
#define MyAppVersion "1.0"
#define MyAppPublisher "Myself"
#define MyAppExeName "MyApp.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{5FA0A2CF-7FD4-4464-AF88-4B73D0857D03}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName=C:\ProgramData\MyApp\{#MyAppName}
DisableDirPage=no
DefaultGroupName=MyApp
;DisableProgramGroupPage=yes
OutputDir=D:\MyApp
OutputBaseFilename=MyApp
Compression=lzma
SolidCompression=yes
PrivilegesRequired=lowest

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Files]
Source: "D:\MyApp\MyApp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\MyApp\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Code]
procedure Update;
var
C: AnsiString;
CU: String;
begin
  LoadStringFromFile(ExpandConstant('conf.yml'), C);
  CU := C;
  StringChangeEx(CU, 'logoImage:', '{app}\ImageLogos.svg', True);
  C := CU;
  SaveStringToFile(ExpandConstant('conf.yml'), C, False);          
end;

function InitializeSetup: Boolean;
begin
  Update;
  result := True;
end;

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}""

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent"

我的配置文件(conf.yml)的子集如下:

graphs:

    Temperature:
        plots:
            Temperature pcolor:
              cmap: nipy_spectral
              type: contourf
              var: thetao
              min: 10.0
              max: 35.0
              units: Celsius

    Salinity:
        plots:
            Salinity pcolor:
              type: contourf
              var: so
              min: 25.0
              max: 50.0
              units: Practical Salinity Unit

logoImage: 'D:\MyApp\ImageLogos.svg'
appTitle: 'MyApp'

我想要的是将logoImage的路径更改为已安装应用程序的路径。

如果使用脚本,则可以编译并安装软件,但不会更改配置文件。

我发现的所有示例都使用JSON,并且它们使用第三方库。

您有什么建议吗?

1 个答案:

答案 0 :(得分:1)

YAML(1.2)是JSON的超集,但并非相反。

因此,您必须将YAML解析器与安装程序(作为第三方库)和AFAIK(http://yaml.org/)一起提供,而InnoSetup和Pascal都没有。

假设有这样的程序并且具有正确的解析器,您也许可以使用最终会读取YAML文件的语言从安装程序运行程序。

确定的工作方式是您自己读取,更新和写入文件。字符串替换通常适用于此类情况。通常,这不是更新YAML的最佳方法,但是如果首先发送文件,则可以确切知道它的外观,并且您实际上不需要解析器。您可能需要一个解析器,以防语法可能更改为语义上等效的YAML,例如您的块样式已转换为流样式:

{graphs: {Temperature: {plots: {Temperature pcolor: {cmap: nipy_spectral, type: contourf, var: thetao, min: 10.0, max: 35.0, units: Celsius}}}, 
  Salinity: {plots: {Salinity pcolor: {type: contourf, var: so, min: 25.0, max: 50.0, units: Practical Salinity Unit}}}},
  logoImage: "D:\\MyApp\\ImageLogos.svg", appTitle: MyApp}