【问题标题】:.csproj file doesn't properly import other project.csproj 文件未正确导入其他项目
【发布时间】:2017-08-01 12:56:08
【问题描述】:

Project1.csproj 包含一个导入语句,它应该(在理想情况下)导入 Project2:

<Import Project="Project2.targets"/>

Project2.targets 仅包含资源导入列表:

<Project DefaultTargets="BeforeBuild"  
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
<Target Name="BeforeBuild">   
  <ItemGroup>
    <Resource Include="resources\logo.png" />
  </ItemGroup>
  <ItemGroup>
    <Resource Include="resources\icon.ico" />
  </ItemGroup>
</Target>
</Project>  

在 Project1 中,元素使用这些 Project2 定义的资源,例如图标。即使构建成功,资源也不包含在最终的可执行文件中。

我到底做错了什么?将 Project1.csproj 中的 import 语句替换为 ItemGroup 资源定义会导致工作程序。

我的目标是导入外部定义的资源列表,我认为可以通过导入另一个项目来完成。

【问题讨论】:

  • 可能将资源添加到 Resource ItemGroup 为时已晚,因为它们位于解析全局 ItemGroups 之后运行的目标中,因此在 BeforeBuild 运行之前引用 ItemGroup 的其他一些组件没有看到他们.. 他们必须在目标中吗?如果没有,那可能只是解决问题。
  • 另外,根据&lt;Import&gt; 在源文件中的位置,BeforeBuild 目标可能会被覆盖。但是,我还建议将项目放在目标之外。
  • @stijn 将项目移出Target 并将Import 放在Project1.csproj 的末尾确实解决了这个问题。如果您发布,我将接受您或 Martin Ullrich 的回答。

标签: c# visual-studio msbuild


【解决方案1】:

导入不是问题:导入文件类似于将其内容复制到导入发生的位置。问题是资源项被添加到目标中,并且:

  • 目标根本没有运行(因为正如 Martin 评论的那样,它被覆盖了,或者因为 it is not even considered for execution)
  • 目标运行,但在发生这种情况时,另一个负责获取可执行文件中包含的资源的组件已经运行,因此只考虑了第一个全局 ItemGroup 定义而没有添加您的项目

因此,将 ItemGroup 移出 Target 可以解决此问题,如果您想更深入地寻找根本原因,可以通过 Message 任务使用一些日志记录来检测您的代码。

【讨论】:

    猜你喜欢
    • 2020-10-21
    • 2021-01-29
    • 2021-03-17
    • 1970-01-01
    • 2021-11-06
    • 2016-01-15
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    相关资源
    最近更新 更多