Inno Setup: изменить значение в файле YAML - PullRequest
0 голосов
/ 30 октября 2018

Я создал файл ISS для Inno Setup для установки программного обеспечения, и у меня есть файл конфигурации 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 голосов
/ 30 октября 2018

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}
...