如何使用msbuild在构建期间生成文件

Dbl*_*Dbl 8 msbuild

有没有人知道如何修改csproj文件以在构建期间生成代码文件而不实际引用文件?

一个过程如:

  • 创建文件,
  • 在构建期间动态引用临时文件
  • 编译程序集具有其他成员,具体取决于构建期间创建的文件

这样做的目的是创建一种使用roslyn而不是使用t4模板生成代码文件的方法,一旦您尝试根据属性执行某些操作,这些模板就非常难以使用.

因此,我计划提供一种方法来使用特殊的csharp文件(用于完整语法支持),以基于该特殊文件的内容以编程方式生成文件.

我花了几个星期的时间研究互联网上的资源(主题为msbuild),但直到现在我似乎没有使用正确的关键字.

这个对我来说是最具洞察力的一个:https: //www.simple-talk.com/dotnet/.net-tools/extending-msbuild/

我的猜测是,为了我的目的,正确的构建目标应该是"BeforeCompile",以便以某种方式使用自定义代码文件填充构建过程.

有没有人有我的问题经验,或者知道任何特定的资源来处理这个任务?

我得到它的解决方案:

<UsingTask TaskName="DynamicCodeGenerator.DynamicFileGeneratorTask" AssemblyFile="..\DynamicCodeGenerator\bin\Debug\DynamicCodeGenerator.dll" />
<Target Name="DynamicCodeGeneratorTarget" BeforeTargets="BeforeBuild;BeforeRebuild">
    <DynamicFileGeneratorTask>
        <Output ItemName="Generated" TaskParameter="GeneratedFilePaths" />
    </DynamicFileGeneratorTask>
    <ItemGroup>
        <Compile Include="@(Generated)" />
        <FileWrites Include="@(Generated)" />
        <!-- For clean to work properly -->
    </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有按照建议使用属性组覆盖

更新:此链接也很有趣:https://github.com/firstfloorsoftware/xcc/blob/master/FirstFloor.Xcc/Targets/Xcc.targets

Aus*_*ris 12

我想使用 bash 脚本为在 Linux 上使用 dotnet core 的项目生成代码。这对我有用。谢谢@stukselbax,我根据你的回答建立了这个。

  <Target Name="GenerateProtocolBuffers" BeforeTargets="BeforeBuild;BeforeRebuild">
    <Exec Command="./generatecode.sh" Outputs="proto/*.cs">
      <Output ItemName="Generated" TaskParameter="Outputs" />
    </Exec>
    <ItemGroup>
      <Compile Include="@(Generated)" />
      <FileWrites Include="@(Generated)" />
    </ItemGroup>
  </Target>
Run Code Online (Sandbox Code Playgroud)

请注意,我用来生成代码的脚本称为 generatecode.sh。用你自己的替换它。

  • 我最终使用 **CoreCompile** ```&lt;Target Name="PreBuild" BeforeTargets="CoreCompile"&gt;``` 而不是尝试使用输出。 (2认同)

stu*_*bax 9

生成代码文件可以通过msbuild任务msbuild内联任务来实现.由您来生成正确的代码.您必须关注的一件事是创建输出项参数,以便将其附加到@(编译)项.您可以使用$(IntDir)位置来查找新生成的文件,并将它们添加到@(FileWrites)项目组,以使Clean目标正常工作.

完成任务后,必须在项目中使用它,如下所示:

<UsingTask TaskName="TaskTypeFullName" AssemblyFile="YourAssembly.dll"/>
<PropertyGroup>
<!-- Here you need to experiment with [Build/Compile/SomeOther]DependsOn property -->
    <BuildDependsOn>
        MyCodeGenerator;
        $(BuildDependsOn)
    </BuildDependsOn>
</PropertyGroup>

<Target Name="MyCodeGenerator">
    <YourTaskName>
        <Output ItemName="Generated" TaskParameter="GeneratedFiles" />
    </YourTaskName>
    <ItemGroup>
        <Compile Include="@(Generated)" /> 
        <FileWrites Include="@(Generated)" /> <!-- For clean to work properly -->
    </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)