免责声明:我承认我有时在浏览文档时遇到困难,并且不以 MSI 为生。
我有一个包含一堆项目的解决方案,其中一个是安装程序,另一个 - 为了便于讨论 - Windows 服务 Foo。
\FooInstaller
-> WiX here
\Foo
-> Dotnet core windows service here
Foo.sln
在我的安装程序项目中,我有一个这样的文件
<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?ifndef $(env.CI)?>
<?include SourcePaths.Local.wxi?>
<?else?>
<?if $(env.CI) != ""?>
<?include SourcePaths.CI.wxi?>
<?else?>
<?include SourcePaths.Local.wxi?>
<?endif?>
<?endif?>
</Include>
which for Some Reasons™ 为 CI 和本地构建定义了一组不同的路径。在我的 v4 项目中看起来像这样:
<Include xmlns="http://wixtoolset.org/schemas/v4/wxs">
<?warning This is NOT a CI build (local?)?>
<?define FooSource = "SourceDir"?> <!-- in the .Local variant. In the .CI variant it's an absolute path -->
</Include>
然后,该组件使用 WiX4 风格的基于热的收集来生成一个巨大的文件,其中有无数的条目,如下所示(在搜索/替换以使用我的路径之后)
<Component Id="cmpDufKoLsEXviYiwOW8uU0YqqkTrU" Directory="foodir" Guid="{BD9D7EF7-C97D-48DB-B0B6-1F5CBA3E2DE9}">
<File Id="filPesrMHNYqq.3oDZxmNT0UmP9XUI" KeyPath="yes" Source="$(FooSource)\appsettings.json" />
</Component>
.. 这对于 CI 和本地构建来说效果很好。
$(FooSource)
要么是完整路径,要么是“SourceDir”,对我来说这是未记录的黑魔法,它只是起作用并从项目引用及其输出文件夹中获取文件。
现在我想减少这些自动生成的文件并使用新的 WiX 5 功能。我天真的尝试看起来像这样(相关片段):
<Fragment>
<?include SourcePaths.wxi?>
<ComponentGroup Id="foofiles">
<Files Include="$(FooSource)\**">
<!--
Don't harvest the service because it needs manual authoring (below).
-->
<Exclude Files="$(FooSource)\foo-service.exe" />
</Files>
我希望它能成为正在运行的 WiX 4 版本的直接替代品。但不幸的是,这在构建时警告我:
warning WIX8601: Missing directory for harvesting files: Could not find a part of the path 'D:\Foo\FooInstaller\SourceDir'
这..不足为奇。这从字面上看是
SourceDir
并且该目录不存在。 有没有办法让这项工作正常进行,或者我是否坚持使用 WiX4 方式手动生成文件,然后手动编辑它们(比如引用我的路径变量,排除服务等)?我的 SourceDir 魔法去哪儿了?
是的。停止依赖非常旧的
SourceDir
“魔法”(大约 WiX v2),它没有在新功能中得到继承,而是使用命名绑定路径。
<File Source="!(bindpath.YourName)\yourfile.foo" />
<Files Source="!(bindpath.SomeName)\**" />
绑定路径使用起来更加明确。