我正在部署一个产品,其中包含一些配置 xml 文件中的加密字段。在安装过程中,我正在目标机器上创建一个自签名证书。然后我用它来加密一些字符串,最后我需要将它们存储在一个配置文件中。
为了创建证书,我将makecert.exe带到目标安装目录。因此,我需要等到所有文件都复制到它们的目的地,然后才能运行创建证书的 CustomAction。在此之后,其他一些 CustomAction 正在创建需要存储在配置中的加密值。
这很好用,但此时我想将新值存储在我的配置文件中,但我已经错过了执行 XmlFile/XmlConfig 的阶段。在 MSI 日志中,我看到在复制文件后立即执行了“ExecXmlConfig”操作:
MSI (s) (6C:CC) [02:12:10:898]: Source for file 'makecert.exe' is compressed
InstallFiles: File: makecert.exe, Directory: C:\Program Files (x86)\MyProduct\InstanceFolder\, Size: 60240
MSI (s) (6C:CC) [02:12:10:900]: Executing op: SetTargetFolder(Folder=C:\Program Files (x86)\MyProduct\Nhibernate\)
MSI (s) (6C:CC) [02:12:10:900]: Executing op: SetSourceFolder(Folder=1\o1lebnnf\vemzkq_g\|MyProduct\Nhibernate\)
MSI (s) (6C:CC) [02:12:10:901]: Executing op: FileCopy(SourceName=nw4bpvhi.xml|hibernate.cfg.xml,SourceCabKey=nhibernate.config,DestName=hibernate.cfg.xml,....
MSI (s) (6C:CC) [02:12:10:902]: File: C:\Program Files (x86)\MyProduct\Nhibernate\hibernate.cfg.xml; Won't Overwrite; Won't patch; Existing file is unversioned but modified
MSI (s) (6C:CC) [02:12:10:902]: Executing op: SetTargetFolder(Folder=C:\Program Files (x86)\MyProduct\InstanceFolder\)
MSI (s) (6C:CC) [02:12:10:902]: Executing op: SetSourceFolder(Folder=1\o1lebnnf\|MyProduct\)
MSI (s) (6C:CC) [02:12:10:902]: Executing op: FileCopy(SourceName=7z64.dll,SourceCabKey=Seven7z64.dll,DestName=7z64.dll,Attributes=512,...
MSI (s) (6C:CC) [02:12:10:903]: File: C:\Program Files (x86)\MyProduct\InstanceFolder\7z64.dll; To be installed; Won't patch; No existing file
MSI (s) (6C:CC) [02:12:10:903]: Source for file 'Seven7z64.dll' is compressed
InstallFiles: File: 7z64.dll, Directory: C:\Program Files (x86)\MyProduct\InstanceFolder\, Size: 1484800
MSI (s) (6C:CC) [02:12:10:929]: Executing op: CacheSizeFlush(,)
MSI (s) (6C:CC) [02:12:10:929]: Executing op: ActionStart(Name=ExecXmlConfigRollback,,)
Action 02:12:10: ExecXmlConfigRollback.
MSI (s) (6C:CC) [02:12:10:948]: Executing op: CustomActionSchedule(Action=ExecXmlConfigRollback,ActionType=3329,Source=BinaryData,Target=ExecXmlConfigRollback,...
MSI (s) (6C:CC) [02:12:10:949]: Executing op: ActionStart(Name=ExecXmlConfig,,)
Action 02:12:10: ExecXmlConfig.
MSI (s) (6C:CC) [02:12:10:951]: Executing op: CustomActionSchedule(Action=ExecXmlConfig,ActionType=3073,Source=BinaryData,Target=ExecXmlConfig,CustomActionData=1?C:\Program Files (x86)\MyProduct\Nhibernate\hibernate.cfg.xml?3?0?/hibernate-configuration/session-factory/property[@name='connection.connection_string']????0)
所以我被困在两者之间......如果我将我的 CustomAction 配置为运行After='InstallFiles'
,它会在文件被复制之前很久就尝试执行。(我错过了正确的事件吗?)。另一方面,如果我将我的操作配置为运行After='InstallFinalize'
- 为时已晚,因为 XmlConfig 已经触发并且没有向配置文件写入任何内容。理想情况下,我想在安装的最后运行所有这些。
我应该编写一个与 ExecXmlConfig 执行完全相同的操作的 CustomAction 只是为了在其他时间调用它,这似乎很愚蠢......
这是我的 InstallExecuteSequence:
<InstallExecuteSequence>
<!-- Create and Register Certificate on Install -->
<Custom Action='GenerateProductCertificate' After='InstallFiles'><![CDATA[REMOVE<>"ALL"]]></Custom>
<Custom Action='RegisterProductServiceCertificate' After='GenerateProductCertificate'><![CDATA[REMOVE<>"ALL"]]></Custom>
<!-- Create and NHibernate Certificate -->
<Custom Action='GenerateNHibernateCertificate' After='RegisterProductServiceCertificate'><![CDATA[REMOVE<>"ALL"]]></Custom>
<!-- Configure NHibernate XML with Encrypted ConnectionString -->
<Custom Action='GenerateSecureConnectionString' After='GenerateNHibernateCertificate'><![CDATA[(REMOVE<>"ALL")]]></Custom>
</InstallExecuteSequence>
我正在使用 WiX 3.7(v3.7.1022.0,2012 年 10 月 22 日,星期一)
我的问题是:
- 有没有办法重新安排 ExecXmlConfig 操作在我的 CustomActions 之后运行?
- 如果没有,我可以安排我的 CustomAction 在复制文件和 ExceXmlConfig 之间运行吗?
编辑:
经过几次尝试和更多研究后,我可以更准确地定义我的问题。我想知道的是:如何设置延迟操作的输出值,该输出值可用于下一个延迟操作?
我的场景迫使我以延迟模式运行自定义操作,因此我无法访问 Session 来存储任何新变量。但我确信会安排更多的延迟操作,所以我想做的是找到一种方法将一些变量传递给它们。