我在 FolderA 中有一个C#项目 A ,它引用了共享项目 B 。共享项目的文件位于 FolderB 中。共享项目 B 包含一个文件 C.gz ,其属性为
构建操作 嵌入式资源
复制到输出目录 不复制
当我尝试使用 xbuild (特别是版本4.8和4.8.1,x86和x64架构)构建项目 A 时:
xbuild A.csproj
我收到以下构建错误:
C:\ Program Files(x86)\ Mono \ lib \ mono \ xbuild \ 14.0 \ bin \ Microsoft.Common.targets(CopyNonResxEmbeddedResources target) - >
C:\ Program Files(x86)\ Mono \ lib \ mono \ xbuild \ 14.0 \ bin \ Microsoft.Common.targets:错误:无法将FolderA \ C.gz复制到FolderA \ obj \ Release \ C.gz,因为源文件不存在。
即。 xbuild 在 FolderA 中搜索嵌入式资源文件,尽管它与共享项目 B中的其他文件一起显然位于 FolderB 中
将嵌入式资源文件移动到项目 A 是不可行的选择,因为共享项目也是从其他几个项目中引用的。
我是否可以通过 xbuild 成功完成项目 A 的构建?
旁注:这是 xbuild 中的预期行为,还是一个错误?使用 msbuild ,我没有这个问题。
答案 0 :(得分:1)
此问题似乎是当前 xbuild 实现中的一个缺陷,因此我需要针对此问题应用特定的解决方法。
由于 xbuild 希望嵌入式资源文件在 FolderA 文件夹中可用,我只需在项目文件中添加预构建步骤:
<ItemGroup>
<FilesToCopy Include="..\FolderB\C.gz" />
</ItemGroup>
<Target Name="BeforeBuild">
<Copy SourceFiles="@(FilesToCopy)" DestinationFolder="."/>
</Target>
可选地,通过在构建后删除复制的文件,可以考虑在构建之后进行清理。
注意!为了确保正确地考虑预构建步骤,请确保在这一行之后将其放置:
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />