为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确打包生成源代码的 Nuget 分布式自定义工具作为构建的一部分

如何正确打包生成源代码的 Nuget 分布式自定义工具作为构建的一部分

C#
慕婉清6462132 2022-12-31 13:15:22
多亏了 Nate McMaster 的这篇精彩文章,我知道了如何将 .NET Core 控制台应用程序打包为 Nuget 包,自动将自身安装为(在本例中为预编译任务)构建任务。为了测试是否一切正常,我只是让我的自定义工具写出一个公共 C# 类。这是 Github 上完整且可运行的示例。但是,我的自定义工具添加的文件实际上并不是构建的一部分(第一个实际生成文件的文件),因此引入的类在第一次构建后不在程序集中(请参见 此处的第 38 行)。但是,由于 .NET Core 项目现在自动将所有 .cs 文件包含在项目旁边,因此它将新类构建到后续构建的输出中(参见此处的第 57 行)。生成的文件不会完全消失,但通常不会像 MSBuild 任务输出的那样。但是,因为 exec 发生在目标文件中,所以我们应该可以访问所有机制来实现这一点。所以我的问题是:我如何正确执行自定义构建工具(控制台应用程序),该工具需要检查项目及其文件并生成源代码(最好在 obj/ 中作为<foo>.g.cs单个构建的一部分编译到生成的程序集中?理想情况下,这生成的文件也不应出现在解决方案资源管理器中。帮助!
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

在中间文件夹中生成中间文件(CustomTool.g.cs)时(您需要对其进行解析,请参阅 Refit 库中的示例: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>


查看完整回答
反对 回复 2022-12-31
  • 1 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信