如何正确打包在生成过程中生成源代码的 Nuget 分布式自定义工具



感谢Nate McMaster的这篇很棒的文章,我知道如何将.NET core控制台应用程序打包为Nuget包,该包会自动将自身安装为(在本例中为预)构建任务。

为了测试一切是否正常,我只是让我的自定义工具写出一个公共 C# 类。

这是Github上完整且可运行的示例

但是,我的自定义工具添加的文件并不是生成的一部分(实际生成文件的第一个文件),因此引入的类在第一次生成后不在程序集中(请参阅此处的第 38 行)。但是,由于 .NET 核心项目现在会自动将所有.cs文件与项目一起包含,因此它会在后续生成时将新类生成到输出中(请参阅此处的第 57 行)。

但是,生成的文件不会在清理时消失,并且通常不会像 MSBuild 任务输出的那样。但是,由于 exec 发生在目标文件中,因此我们应该有权访问所有机制来实现此目的。所以我的问题是:

如何正确执行自定义生成工具(控制台应用),该工具需要检查项目、其文件并生成源代码(最好是 obj/格式,例如作为单个生成的一部分编译到生成的程序集中的<foo>.g.cs?理想情况下,此生成的文件也不应显示在解决方案资源管理器中。

帮助!

在中间文件夹中生成中间文件 (CustomTool.g.cs) 时(您需要解析它,请参阅改编库中的示例:https://github.com/reactiveui/refit/blob/5b4e14aaf8a1fcc27396b7c08171d100aba1b97d/Refit/targets/refit.targets#L11);您需要将其显式添加为编译项。

以示例目标文件 (https://github.com/aniongithub/CustomTool/blob/master/CustomTool/RunCustomTool.targets#L13):

<Project>
<PropertyGroup>
<IntermediateOutputPath Condition="$(IntermediateOutputPath) == '' Or $(IntermediateOutputPath) == '*Undefined*'">$(MSBuildProjectDirectory)obj$(Configuration)</IntermediateOutputPath>
<!-- Command to invoke CustomTool -->
<CustomTool>dotnet "$(MSBuildThisFileDirectory)/netcoreapp2.2/CustomTool.dll"</CustomTool>
<!-- Other variables  -->
<CustomVariable>"$(MSBuildProjectDir)"</CustomVariable>
</PropertyGroup>
<Target Name="CustomTool" BeforeTargets="CoreCompile" DependsOnTargets="PrepareForBuild">
<Exec Command="$(CustomTool) $(ProjectPath) $(IntermediateOutputPath)CustomTool.g.cs" />
<!-- add generated file as a compile item, otherwise it won't get picked up -->
<ItemGroup Condition="Exists('$(IntermediateOutputPath)CustomTool.g.cs')">
<Compile Include="$(IntermediateOutputPath)CustomTool.g.cs" />
</ItemGroup>
</Target>
</Project>

相关内容

  • 没有找到相关文章

最新更新