2015-09-19 52 views
4

有誰知道如何修改一個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

回答

6

生成代碼文件可以通過msbuild taskmsbuild inline task來實現。由您來生成正確的代碼。你必須關心的一件事是創建輸出項目參數,以便將其附加到@(編譯)項目。您可以使用$(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> 

+0

不錯!我已經開始進入UsingTask方向,但是我沒有將它與Output + Compile聲明結合起來。這應該能夠完成這項工作。一旦我證實了這一點,我會檢查+ upvote你的答案。它看起來很有希望。感謝您的幫助 – Dbl

+0

另請注意,爲了使目標正確執行 - 必須在導入項目特定目標(即Microsoft.CSharp.targets)後聲明屬性** BuildDependsOn **。 – stukselbax

+0

我會在我回家後測試這個。從我讀過的東西中我可以猜到這應該如何工作,但還有一個確認問題:@(Generated)支持「subfolder1/file.cs; subfolder2/file.cs」這樣的語法,並依賴於根據我生成的文件到csproj的相對路徑(就像編譯include一樣)?如果我知道了,文件必須複製到那裏,因爲它們將在構建週期的後期被移動。正確? – Dbl