NuGet 仅将我的 .targets 文件导入顶级项目

NuGet only imports my .targets file into the top project

我的解决方案中有多个项目,它们都安装了相同的 NuGet 包。我通过菜单中的 'Manage Nuget Packages for Solution' 选项安装了这个 NuGet 包。

现在这个特定的 NuGet 包在我的构建文件夹中有一个 .targets 文件,它将一些文件导入到构建中。

当我重建我的解决方案时,这些文件仅为顶级项目复制。其他项目不会将文件复制到它们的构建文件夹中。这让我很头疼,因为所有项目的构建文件夹中都需要这些文件。

当我查看我的 .csproject 文件时,我发现了以下差异:

项目 1

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Import Project="..\packages\NuGetTester.1.0.1\build\NuGetTester.targets" Condition="Exists('..\packages\NuGetTester.1.0.1\build\NuGetTester.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\NuGetTester.1.0.1\build\NuGetTester.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NuGetTester.1.0.1\build\NuGetTester.targets'))" />
  </Target>
</Project>

项目 2 第二个项目没有这些行。

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

当我在第二个项目中包含这些行时,一切似乎都正常。 有人可以解释为什么这只发生在第一个项目中吗?我能否以某种方式强制安装此 NuGet 的解决方案中的每个项目也将包含这些行?我不能强迫我的用户手动包含它。

编辑,这是 .targets 文件。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Content Include="$(MSBuildThisFileDirectory)\Versions\*.sql">
      <Link>App_Data\Versions\%(FileName)%(Extension)</Link>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

谢谢

Can someone explain why this only happens for the first project? Can I somehow force that every project in the solution that installs this NuGet will also include these lines?

没有安装 nuget 包日志,我无法给出为什么这只发生在第一个项目中的原因。但是当你通过'Manage Nuget Packages for Solution'选项安装 NuGet 包时,你应该确保你已经将 nuget 包安装到所有项目:

如果所有复选框都被选中,你仍然有这个问题,你应该单独安装那个包到有问题的项目,然后检查安装日志。

以防万一,此问题有解决方法。您可以在与您的解决方案相同的文件夹中创建一个名为“Directory.Build.props”的 MSBuild 项目文件,其中包含您的内容。 它将原始导入到目录层次结构中的所有项目中。

查看 this document 了解更多详情。

希望这对您有所帮助。

据我所知,项目的顺序似乎不是问题所在。 只有当我的构建文件夹中的目标 (net46) 文件夹中没有文件时,才会出现此问题。

将随机文件放入 .NET 目标文件夹后,.targets 文件将导入到项目中。或者,如果我从构建中删除所有 .NET 目标文件夹,它会照常工作。

所以简单总结一下。

  • 构建没有 .NET Framework 目标文件夹的文件夹 -> 有效
  • 使用空的 .NET Framework 目标文件夹构建文件夹 -> 不起作用
  • 使用包含一个或多个文件的 .NET Framework 目标文件夹构建文件夹 -> 有效