如何通过 MSBuild 复制任务复制 NuGet 包引用的内容文件

How to copy contentFiles of NuGet package references via MSBuild Copy task

我们有几个存储库,每个存储库都有自己的 .editorconfig。显然,这些没有同步,这就是为什么我想通过 NuGet 包从我们的框架解决方案(连同其他文件)分发 .editorconfig 到我们所有的 repositories/solutions 并通过一个简单的 Copy build Task 将它复制到解决方案目录。

我尝试执行以下操作:

创建一个项目“EditorConfigDistribution”,它应该包含主 .editorconfig 文件。

<Project Sdk="Microsoft.NET.Sdk">
  ...
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <NoDefaultExcludes>true</NoDefaultExcludes>
  </PropertyGroup>

   <ItemGroup>
    <Content Include=".editorconfig">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>true</Pack>
      <PackageCopyToOutput>false</PackageCopyToOutput>
      <PackagePath>contentFiles\any\any\content</PackagePath>
    </Content>
  </ItemGroup>
</Project>

这一切都按预期工作,我确实从其他解决方案中获得了我的项目中所需的 .editorconfig 文件,它在文件夹 content/.editorconfig 中被引用为快捷方式(参见 EditorConfigConsumer Project Structure)。 该文件仅是对 C:\Users\<user>\.nuget\packages\editorconfigdistribution.0.0\contentFiles\any\any\content\.editorconfig.

的引用

现在,我想通过构建任务复制那个 .editorconfig 文件:

<Project Sdk="Microsoft.NET.Sdk">
  ...
  <ItemGroup>
    <PackageReference Include="EditorConfigDistribution" Version="1.0.0">
    </PackageReference>
  </ItemGroup>

  <Target Name="CopyEditorConfig" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <EditorConfigFileToCopy Include="$(MSBuildProjectDirectory)\content\.editorconfig" />
    </ItemGroup>
    <Copy SourceFiles="@(EditorConfigFileToCopy)" DestinationFolder="$(MSBuildProjectDirectory)\.." SkipUnchangedFiles="true" UseHardlinksIfPossible="false" />
  </Target>
</Project>

但是,我收到以下错误:

Error MSB3030: Could not copy the file "C:\Users\weberma9\source\repos\<some_path>\EditorConfigConsumer\content\.editorconfig" because it was not found. (20, 5)

我知道无法找到该文件(因为它是一个快捷方式),但我就是想不出在我的构建任务中正确引用该快捷方式的方法。 我需要在那行 <EditorConfigFileToCopy Include="$(MSBuildProjectDirectory)\content\.editorconfig" /> 中更改什么?

当然,如果您有更好的方法来解决我的一般问题 - 我很高兴听到。

我找到了解决问题的方法: 我不仅提供 .editorconfig,还通过我的 EditorConfigDistribution 项目提供 Copy-Build 任务,现在看起来像这样:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <NoDefaultExcludes>true</NoDefaultExcludes>
  </PropertyGroup>

  <ItemGroup>
    <None Include="..\..\.editorconfig">
      <Link>Rules\.editorconfig</Link>
      <Pack>true</Pack>
      <PackageCopyToOutput>false</PackageCopyToOutput>
      <PackagePath>Rules\</PackagePath>
    </None>
  </ItemGroup>

  <ItemGroup>
    <None Include="build\**">
      <Pack>true</Pack>
      <PackageCopyToOutput>false</PackageCopyToOutput>
      <PackagePath>build\</PackagePath>
    </None>
  </ItemGroup>
</Project>

.props 文件很简单,并且由于 .props 和 .target 被添加到使用该包的项目的约定(请参阅 Include MSBuild props and targets in a package), 总是在'BeforeBuild'.

之前执行

EditorConfigDistribution.props(放在构建文件夹中):

<Project>
  <Target Name="CopyEditorConfig" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <EditorConfigFilesToCopy Include="$(MSBuildThisFileDirectory)..\Rules\.editorconfig" />
    </ItemGroup>
    <Copy SourceFiles="@(EditorConfigFilesToCopy)" DestinationFolder="$(SolutionDir).." SkipUnchangedFiles="true" UseHardlinksIfPossible="false" />
  </Target>
</Project>