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