我想使用 Wix5 创建一个安装程序。我们要安装的软件依赖于另一个软件,并且有一些文件取决于安装的必备软件的版本。
假设安装的软件有版本1。然后我只想安装 Version1 的文件。 如果安装了 Version2,则安装 Version2 的文件,依此类推。
但是要安装的文件具有相同的名称,所以我收到错误: WIX0091 找到标识符为“...”的重复文件。访问修饰符(全局、库、文件、部分)无法防止这些冲突。确保给定类型(目录、文件等)的所有标识符都是唯一的。
这并不意外,因为我确实有相同名称的文件将安装到同一目录中。但实际上,这永远不会成为问题,因为您在安装时选择了一个版本,并且实际上只安装了这些文件。我该如何最好地处理这个问题?
我提出的一个解决方案是为每个版本创建一个组件组,将它们全部安装到一个单独的文件夹中,然后在安装后将它们移动到正确的文件夹中。所以组件组看起来像这样
<ComponentGroup Id="basefilescomponent1" Directory="version1folder">
<Files Include="..\..\..\Project.Version1\bin\$(Configuration)\**">
<Exclude Files="..\..\..\Project.Version1\bin\$(Configuration)\*.pdb"></Exclude>
</Files>
</ComponentGroup>
<ComponentGroup Id="basefilescomponent2" Directory="version2folder">
<Files Include="..\..\..\Project.Version2\bin\$(Configuration)\**">
<Exclude Files="..\..\..\Project.Version2\bin\$(Configuration)\*.pdb"></Exclude>
</Files>
</ComponentGroup>
然后我通过 https://learn.microsoft.com/en-us/windows/win32/msi/movefiles-action 移动它们 或自定义操作。 这对我来说似乎有点“肮脏”。更重要的是,这也意味着我必须在卸载或更新时手动处理这些文件。 另一个想法是每个版本都有一个单独的安装程序,但这也有其缺点。 (主要是需要始终将正确的安装程序传递给客户,而当前安装程序可以使用自定义操作本身检查版本) 所以我想知道是否还有其他更简单的方法。
在这种情况下您不能使用 Files 元素。将各个文件指定为 File 元素,以赋予它们唯一的 Id 属性,然后使用 Condition 属性在运行时仅安装正确的文件集。