【发布时间】:2017-07-02 08:45:38
【问题描述】:
我正在将一个相当大的项目转换为 Windows 10 应用商店应用程序。我已经编译它,现在无法克服几个 APPX1101 错误 - “有效负载包含两个或多个具有相同目标路径的文件”。这些文件是项目的 .xml 文件的一部分,例如“baseDir\Assets\foo\timers.xml”和“baseDir\Assets\bar\timers.xml”。不同的文件和不同的路径。
解决方案和项目由 CMake (3.72) 创建。已修改 cmake 文件以支持创建 Windows 10 商店应用平台配置。
似乎目录树已被展平并且文件重叠。但是如何或为什么使我无法理解。我见过的每个 UWP 项目都在主项目下包含一个“Assets”文件夹,但这个没有。我在名为“资源文件”的文件夹中看到了诸如 Logo.png 和 SplashScreen.png 之类的文件。导致错误的文件位于 UWP 项目之前存在的名为“Assets”的文件夹下。
主要是: 我该如何解决这个错误?我是否错误配置了 CMake?
另外: 如何避免目录扁平化? 有几百个数据文件占用了程序使用的几百兆字节。我需要将它们中的每一个都添加到要打包的解决方案中吗?
更新:
我收集了更多信息,但不足以完全满足这个问题。由于如何通过 CMake 将文件添加到项目以及如何打包原始 Windows 产品,导致输出中的目录扁平化。 XML 文件以 .vcxproj 中的完整路径添加到项目中。 .vcxproj.filters 还使用文件的完整路径和像“Data\foo”这样的过滤器。桌面 Windows 版本不需要关心,因为它知道在哪里可以找到与可执行文件相关的数据,并且是由外部工具打包的。
我手动添加了“资产”过滤器并修改了 .vcxproj 和 .vcxproj.filters 文件。 .vcxproj 文件需要将属性添加到文件的包含中。这使用了相对路径并消除了 APPX1101 重复错误。
.vcxproj
<XML Include="..\Base\Assets\foo\Data\timers.xml">
<Link>Assets\foo\Data\timers.xml</Link>
</XML>
.vcxproj.filters
<XML Include="..\Base\Assets\foo\Data\timers.xml">
<Filter>Assets\foo</Filter>
</XML>
更新 2
据我所知,不可能让 CMake 将 <Link> 添加到 XML 和其他 .vcxproj 包含类型。我浏览了最新的 CMake 源代码(3.8rc)。 <XML Include> 添加到 cmVisualStudio10TargetGenerator::WriteExtraSource() 中的 cmVisualStudio10TargetGenerator.cxx 中的 .vcxproj。其他类型可以选择设置标志来添加<Link>,但XML和其他数据类型没有设置标志的代码。
我能看到的唯一选项是修改 CMake 源或重新设计项目以使用与 vcxproj.filters 文件中匹配的包含相同的 <Filter> 匹配的相对路径添加数据文件。这只是 CMake 的一个问题。 Visual Studio 2015/2017 在树上方添加资产没有问题。 GitHub 上的 MS UWP 示例是为了在示例项目之间共享通用数据。
【问题讨论】:
-
您是否尝试过question 中的解决方案,确保引用的版本没有冲突。但是根据您的异常,您的有效负载中似乎有两个示例 xml 文件,您可以在 Visual Studio 中编译您的项目吗?
-
您能否分享一下您是如何在 CMakeLists.txt 文件中设置资产文件的?
set(ASSET_FILES ${ASSET_FILES}.... -
@FranklinChen-MSFT 我已将范围缩小到如何添加资产。用于创建 .sln 的 CMake 文件改编自可运行且已发布的 Win64 版本。显然有些东西被遗漏了。解决方案编译没有错误。问题出现在链接阶段。我将使用我了解到的信息更新问题,这可能有助于澄清。
-
ASSET_FILES 仍然与 Windows 项目相同,这解释了为什么我在项目中没有典型的“资产”过滤器。通过详细输出,我可以看到添加的文件没有导致冲突的路径。我创建了一个资产过滤器,然后手动编辑了 .vcxproj 以将 添加到文件的
标签: cmake uwp windows-10-universal