【问题标题】:MSBuild or NAnt script that generates C# files, adds them to a project and compiles the project生成 C# 文件、将它们添加到项目并编译项目的 MSBuild 或 NAnt 脚本
【发布时间】:2014-02-06 00:05:44
【问题描述】:

我刚刚为 FluentMigrator API 编写了一个代码生成器应用程序,它发出未知数量的 C# 类文件。我希望编译代码生成器,运行它以发出 C# 类,然后将新的 C# 文件添加到现有的 C# 项目,然后编译最终解决方案。

将代码生成的 C# 文件添加到项目中的最佳方法是什么?

【问题讨论】:

  • 创建一个使用您的代码生成器的 UsingTask,并让代码生成器发送到 $(IntermediateOutput) 目录并将文件名输出到 ItemGroup,然后将该 ItemGroup 合并到 Compile 项目组中.
  • 谢谢尼克。我是 MSBuild 的新手。我已经为 CodeGen 创建了 Task 类,它工作正常。您能否为此展示一些示例 MSBuild XML。
  • - 不知道如何让我的 MSBuild 任务将文件发送到 ItemGroup 或如何将它们合并到 Compile 项目组中。

标签: visual-studio msbuild nant


【解决方案1】:

根据我们从您的帖子中了解到的情况,可能有几种方法。

您有一个将生成一些类文件的 API,并希望将其集成到您的构建过程中,因此您将进行 API 调用以生成新的类文件,然后将这些类文件合并到您的构建中。

如果您的可执行文件将输出文件发送到它的当前工作目录,您可以使用 Exec 任务在 $(IntermeidateOutputPath) 中运行您的命令,以免弄乱项目的源代码树:

<Exec Command="MyExe.exe " WorkingDirectory="$(IntermediateOutputPath)\AutoGenClasses\" />

按照此命令,您可以将这些输出类附加到默认编译组中:

<ItemGroup>
  <Compile Include="$(IntermediateOutputPath)\AutoGenClasses\**\*.cs" />
</ItemGroup>

现在您可能想要控制何时发生这种情况,因此您需要将此代码嵌入到单独的 &lt;Target /&gt; 中,并安排在构建发生之前发生。

<Target Name="AutoGenClasses" BeforeTargets="Compile">
  <Message Text="Starting the AutoGenClasses task..." Importance="high" />
  <Exec Command="MyExe.exe " WorkingDirectory="$(IntermediateOutputPath)\AutoGenClasses\" />
  <ItemGroup>
    <Compile Include="$(IntermediateOutputPath)\AutoGenClasses\**\*.cs" />
  </ItemGroup>
  <Message Text="... completed the AutoGenClasses." Importance="high" />
</Target>

【讨论】:

  • 谢谢尼克。这有帮助。 BeforeTargets="Compile" 技巧很酷。我的代码生成应用程序实际上包含一个 MSBuild 任务类,作为从命令行参数运行它的替代方案。这包括我希望用来返回类文件的这个属性。我想任何一种方式都有效。 [输出] 公共 ITaskItem[] OutputClassFiles { 获取;私人套装; }
  • 您仍然可以使用它,只需使用 UsingTask 任务作为内联任务实现,然后将您的 OutputClassFiles 导入 @Compile ItemGroup。
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2011-12-20
相关资源
最近更新 更多