我有一个.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属性更改为其他所有Target,但完全没有运气。 (在此处描述:https://docs.microsoft.com/en-us/dotnet/core/tools/csproj#build-events) 我也尝试过关闭文件自动包含功能:
<PropertyGroup>
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
</PropertyGroup>
,并制作自己的文件列表进行编译。但这也不起作用。 RS.cs文件仍然生成太晚。
新的项目文件格式似乎非常渴望获得文件列表,以至于似乎没有空间容纳自动生成的文件。
这里的解决方法是什么?
答案 0 :(得分:1)
始终在目标运行之前评估项目文件的静态部分。 但是,您也可以在目标中添加项目:
<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>
“排除”部分可确保如果文件在静态评估(例如其他版本)中已被提取,则不会添加两次。