有誰知道如何修改一個csproj文件的方式來生成代碼文件,而無需實際引用文件?如何使用msbuild生成過程中生成文件
像的方法:
- 創建文件,
- 構建期間動態地引用臨時文件
- 編譯組件具有附加的部件,這取決於構建期間創建的文件
的這樣做的目的是創建一種使用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>
不幸的是我沒有得到它具有的PropertyGroup覆蓋工作的建議
更新:此鏈接有趣太:https://github.com/firstfloorsoftware/xcc/blob/master/FirstFloor.Xcc/Targets/Xcc.targets
不錯!我已經開始進入UsingTask方向,但是我沒有將它與Output + Compile聲明結合起來。這應該能夠完成這項工作。一旦我證實了這一點,我會檢查+ upvote你的答案。它看起來很有希望。感謝您的幫助 – Dbl
另請注意,爲了使目標正確執行 - 必須在導入項目特定目標(即Microsoft.CSharp.targets)後聲明屬性** BuildDependsOn **。 – stukselbax
我會在我回家後測試這個。從我讀過的東西中我可以猜到這應該如何工作,但還有一個確認問題:@(Generated)支持「subfolder1/file.cs; subfolder2/file.cs」這樣的語法,並依賴於根據我生成的文件到csproj的相對路徑(就像編譯include一樣)?如果我知道了,文件必須複製到那裏,因爲它們將在構建週期的後期被移動。正確? – Dbl