在Inno Setup的安装过程中写入Node app .js配置

问题描述

我发现了如何创建向导页面来收集所需信息。但是我的应用程序有一个config.js文件,我需要在其中根据用户输入更改一些值。写入该文件的最佳方法是什么?用SaveStringToFile写入整个文件还是以某种方式导入文件并替换某些字符串部分?

这是当前配置的摘录:

let cfg = {
  hapi: {
    port: 3000,host: '0.0.0.0',maxUploadBytes: 1000000 * 50 // 50 MB
  },jwt: {
    key: 'secretkey',algorithm: 'HS256',expiresIn: '1h'
  },authentication: {
    encryption: {
      saltRounds: 10 // will be used in bcrypt to encrypt passwords
    }
  },db_config: {
    user: 'username',password: 'pw',server: 'DESKTOP-IG',database: 'TestDB-1'
  },scripts: {
    ConnectorInstallPath: "C:\\Program\ Files\\ Connector\\"
  }
}

我必须更改以下各项的值:user: 'username'password: 'pw'server: 'DESKTOP-IG'database: 'TestDB-1'port: 3000ConnectorInstallPath: "C:\\Program\ Files\\ Connector\\"

使用server: '*'之类的模式进行替换就足够了。不必更聪明。

非常感谢。

解决方法

以下功能可以更改配置文件中的属性:

function SetConfigProperty(FileName,Name: string; Value: string): Boolean;
var
  Lines: TArrayOfString;
  Count,I,P: Integer;
  HasComma: Boolean;
  Line: string;
  State: Integer;
begin
  Result := True;

  if not LoadStringsFromFile(FileName,Lines) then
  begin
    Log(Format('Error reading %s',[FileName]));
    Result := False;
  end
    else
  begin
    State := 0;

    Count := GetArrayLength(Lines);
    for I := 0 to Count - 1 do
    begin
      Line := Lines[I];
      P := Pos(':',Line);
      if (CompareText(Trim(Copy(Line,1,P - 1)),Name) = 0) then
      begin
        Log(Format('Found property %s at line %d',[Name,(I + 1)]));

        HasComma := (Copy(Trim(Line),Length(Trim(Line)),1) = ',');

        Line := Copy(Line,P) + ' ' + Value;
        if HasComma then Line := Line + ',';
        Lines[I] := Line;

        Result := SaveStringsToFile(FileName,Lines,False);
        if not Result then
        begin
          Log(Format('Error writing %s',[FileName]));
        end
          else
        begin
          Log(Format('Modifications saved to %s',[FileName]));
        end;

        break;
      end;
      if I = Count - 1 then
      begin
        Log(Format('Property %s not found',[Name]));
        Result := False;
      end;
    end;
  end;
end;

Value必须在冒号后包含完整的内容。使用字符串属性,甚至必须包含引号。例如:

SetConfigProperty(FileName,'server','''DESKTOP-IG''');

您可以在CurStepChanged步骤的ssPostInstall事件函数中使用该函数(已安装文件时):

procedure CurStepChanged(CurStep: TSetupStep);
var
  FileName: string;
  ErrorCode: Integer;
begin
  if CurStep = ssPostInstall then
  begin
    FileName := ExpandConstant('{app}\config.js');
    SetConfigProperty(FileName,'username','''' + UsernameEdit.Text + '''');
    SetConfigProperty(FileName,'Password','''' + PasswordEdit.Text + '''');
    SetConfigProperty(FileName,'''' + ServerEdit.Text + '''');
    SetConfigProperty(FileName,'port',PortEdit.Text);
    { ... }
  end;
end;