我正在尝试使用.msi工具集为Node.js项目创建WiX安装程序。我想在卸载过程中删除node_modules文件夹。以下是我的.wxs文件的相关摘录:
<Property Id='APPLICATIONFOLDER'>
<RegistrySearch Id='ApplicationFolder' Root='HKLM' Key='Software\[ProductName]' Name='InstallDir' Type='raw'/>
</Property>
<DirectoryRef Id='TARGETDIR'>
<Component Id='RemoveFolder' Guid='3e2231d9-61b3-41a2-b407-8df015be537e'>
<util:RemoveFolderEx Property='[APPLICATIONFOLDER]\node_modules' On='uninstall'/>
<RegistryValue Root='HKLM' Key='Software\[ProductName]' Name='InstallDir' Type='string' Value='INSTALLDIR' KeyPath='yes'/>
</Component>
</DirectoryRef>
我认为这将读取注册表中的值,将其分配给属性APPLICATIONFOLDER
,然后在RemoveFolderEx
标记中将字符串\node_modules
附加到该属性的值。
但是当我试图通过light.exe运行这个程序时,我得到了ICE03: Invalid identifier; Table: WixRemoveFolderEx, Column: Property, Key(s): wrf1A1445CB13E8BF98989EA24E3514470A
。
显然,它对我的Property
属性不满意,但是我需要什么来修复它呢?我见过很多指南使用这种通用模式,但是他们总是从注册表读取install值,然后对整个文件夹进行核弹。如果用户将文件添加到目录中,我不想删除它们。如何指定要删除的子文件夹?
发布于 2022-06-11 20:04:25
我已经解决了问题。因为我个人很难弄清楚--我在RemoveFolderEx
上看到的指南都是用相同的用例来处理保存到注册表中的文件夹,而不是子文件夹;而且我发现WiX文档在大多数情况下并不是初学者友好的-,所以我在这里记录解决方案,以防其他人遇到同样的问题。
正如已经指出的那样,Property
的工作方式与我在问题中所设想的不同--它确实只接受保存要删除的目录路径的属性的id。因此,您肯定需要以某种方式设置一个属性。(互联网上的一些指南并没有很清楚地说明这一点。)
要调查的下一个显而易见的路径是为属性分配一个经过修改的注册表搜索结果。然而,用WiX (据我所知)这是不可能的。
答案在于SetProperty
。最后,这允许根据从注册表读取的属性设置一个新属性。
值得注意的是,这样做仍然可以防止删除安装文件夹,即使它是空的。但是,通过添加RemoveFolder
(没有Ex
)可以很容易地解决这一问题。这将删除文件夹,但只在文件夹为空的情况下。
让它为我工作的相关代码如下所示。
<!-- Read the InstallDir from the registry and assign it to property APPLICATIONFOLDER -->
<Property Id='APPLICATIONFOLDER'>
<RegistrySearch
Id='ApplicationFolder'
Root='HKLM'
Key='Software\[ProductName]'
Name='InstallDir'
Type='directory'
Win64='yes'/>
</Property>
<!-- Set new property NODE_MODULES_FOLDER by appending node_modules\ to APPLICATIONFOLDER -->
<SetProperty
Id='NODE_MODULES_FOLDER'
Value='[APPLICATIONFOLDER]node_modules\'
Before='CostInitialize'/>
<Component Id='RemoveFolders' Guid='...'>
<!-- Remove the node_modules subfolder, using the property we created above -->
<util:RemoveFolderEx Property='NODE_MODULES_FOLDER' On='uninstall'/>
<!-- Remove main installation directory now, but only if it is empty. -->
<!-- That's why we're using RemoveFolder instead of RemoveFolderEx here. -->
<RemoveFolder Id='RemoveMainFolder' Property='APPLICATIONFOLDER' On='uninstall'/>
<RegistryValue
Root='HKLM'
Key='Software\[ProductName]'
Name='InstallDir'
Type='string'
Value='[INSTALLDIR]'
KeyPath='yes'/>
</Component>
发布于 2022-06-11 15:31:21
我认为这将读取注册表中的值,将其分配给属性APPLICATIONFOLDER,然后在RemoveFolderEx标记中将字符串\node_modules附加到该属性的值。
不会的。正如医生说的,Property
是:
解析为源目录的完整路径的属性的id。
实现这一目标的最简单方法是编写您想要对注册表执行核弹的确切路径。
https://stackoverflow.com/questions/72583763
复制相似问题