从 WiX 4 迁移到 5,我失去了“SourceDir”魔力

问题描述 投票:0回答:1

免责声明:我承认我有时在浏览文档时遇到困难,并且不以 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 魔法去哪儿了?

wix wix5
1个回答
0
投票

是的。停止依赖非常旧的

SourceDir
“魔法”(大约 WiX v2),它没有在新功能中得到继承,而是使用命名绑定路径。

<File Source="!(bindpath.YourName)\yourfile.foo" />

<Files Source="!(bindpath.SomeName)\**" />

绑定路径使用起来更加明确。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.