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

如何在使用msbuild生成期间生成文件,msbuild,Msbuild,是否有人知道如何修改csproj文件,以便在生成过程中生成代码文件,而不实际引用这些文件? 一个过程,如: 创建文件 在生成期间动态引用临时文件 编译的程序集具有其他成员,具体取决于生成期间创建的文件 这样做的目的是创建一种使用roslyn生成代码文件的方法,而不是使用t4模板,一旦您试图根据属性执行某些操作,使用t4模板将非常困难 因此,我计划提供一种方法,使用一个特殊的csharp文件(用于完整的语法支持)根据该特殊文件的内容以编程方式生成文件 我花了几周时间在互联网上查找资源(主题是m

是否有人知道如何修改csproj文件,以便在生成过程中生成代码文件,而不实际引用这些文件?

一个过程,如:

  • 创建文件
  • 在生成期间动态引用临时文件
  • 编译的程序集具有其他成员,具体取决于生成期间创建的文件
这样做的目的是创建一种使用roslyn生成代码文件的方法,而不是使用t4模板,一旦您试图根据属性执行某些操作,使用t4模板将非常困难

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

我花了几周时间在互联网上查找资源(主题是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>

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


更新:这个链接也很有趣:

生成代码文件可以通过或实现。生成正确的代码取决于您。您必须注意的一件事是创建输出项参数,以便将其附加到@(编译)项。您可以使用$(IntDir)location来定位新生成的文件,并将它们添加到@(FileWrites)项目组,以便清理目标正常工作

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

<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>

微生物发生器;
$(BuildDependsOn)

我想使用bash脚本为Linux上使用dotnetcore的项目生成代码。这是对我有用的东西。谢谢@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>


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

不错!不久前我开始研究UsingTask方向,但我没有将它与输出+编译声明结合起来。这应该可以完成任务。一旦我证实了这一点,我会检查并投票给你的答案。这看起来确实很有希望。感谢您的帮助还请注意,为了正确执行目标,您必须在导入特定于项目的目标(即Microsoft.CSharp.targets)后声明property BuildDependsOn。我回到家后将对此进行测试。从我所读到的内容中,我可以猜到这应该是如何工作的,但还有一个确认问题:@(生成的)支持类似于“subfolder1/file.cs;subfolder2/file.cs”的语法,并且依赖于我根据csproj的相对路径生成文件(就像编译包含一样)?如果我做对了,文件必须复制到那里,因为它们将在构建周期的后期移动。对吗?对。在@(生成的)项目中放置什么完全取决于您。一旦将其包含在编译项中,它们将作为Sources参数传递给Csc任务。此外,项目支持。
BeforeTargets=“BeforeBuild;BeforeBuild”
-这是改变游戏规则的部分。我最终使用了CoreCompile
,而不是尝试处理输出。