如何让网络核心项目包含自动生成的代码文件?

How to get net-core projects to include auto generated code file?

我有一个 .net 核心项目文件 (*.csproj),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0">
  <!-- Create RS.cs -->
  <ItemGroup>
    <ResourceGeneratorInputs Include="strings.resx" />
    <ResourceGeneratorOutputs Include="RS.cs" />
  </ItemGroup>
  <Target Name="GenerateTheResourceFile" 
        BeforeTargets="PrepareForBuild" 
        Inputs="@(ResourceGeneratorInputs)" 
        Outputs="@(ResourceGeneratorOutputs)">
    <Exec Command="ResourceStringGenerator.exe strings.resx RS.cs " />
  </Target>
</Project>

此项目有一个生成名为 RS.cs 的 csharp 代码文件的目标,该文件也必须编译。

问题是文件生成的太晚了。构建引擎已经读取项目目录中的文件列表,RS.cs 文件被忽略。

我曾尝试将 BeforeTargets 属性更改为各种其他目标,但都没有成功。 (此处描述:https://docs.microsoft.com/en-us/dotnet/core/tools/csproj#build-events) 我也试过关闭自动包含文件:

 <PropertyGroup>
    <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
  </PropertyGroup>

并制作我自己的要编译的文件列表。但这也没有用。 RS.cs 文件仍然生成得太晚。

新的项目文件格式似乎急于获取文件列表,似乎没有给自动生成的文件留下空间。

这里有什么解决方法?

项目文件的静态部分总是在目标 运行 之前计算。 但是,您也可以在目标中添加项目:

<Target Name="GenerateTheResourceFile" 
      BeforeTargets="PrepareForBuild" 
      Inputs="@(ResourceGeneratorInputs)" 
      Outputs="@(ResourceGeneratorOutputs)">
  <Exec Command="ResourceStringGenerator.exe strings.resx RS.cs " />

  <ItemGroup>
    <EmbeddedResource Include="strings.resx" Exclude="@(EmbeddedResource)" />
    <Compile Include="RS.cs" Exclude="@(Compile)" />
  </ItemGroup>
</Target>

"exclude" 部分确保如果文件已经在静态评估期间被拾取(即额外构建),则该文件不会被添加两次