我为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,并且它们使用第三方库。
您有什么建议吗?
答案 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}