2010-06-12 149 views
2

環顧四周後,我無法找到這個問題的簡單答案。MSBuild:添加額外的文件進行編譯,而不改變項目文件

我想創建一個MSBuild文件,以便我可以在Visual Studio 2010 express中輕鬆使用SpecFlow和NUnit。

下面的文件不完整,這僅僅是一個概念的證明,它需要更通用。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <PropertyGroup> 
     <BuildDependsOn> 
      BuildSolution;   
      SpecFlow; 
      BuildProject;   
      NUnit; 
     </BuildDependsOn> 
    </PropertyGroup> 

    <PropertyGroup> 
     <Solution>C:\Users\Craig\Documents\My Dropbox\Cells\Cells.sln</Solution> 
     <CSProject>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\Configuration.csproj</CSProject> 
     <DLL>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\bin\Debug\Configuration.dll</DLL> 
     <CSFile>C:\Users\Craig\Documents\My Dropbox\Cells\Configuration\SpecFlowFeature1.feature.cs</CSFile> 
    </PropertyGroup> 

    <Target Name="Build" DependsOnTargets="$(BuildDependsOn)"> 
     <Message Text="Build Started" Importance="high" /> 
     <Message Text="Build Ended" Importance="high" /> 
    </Target> 

    <Target Name="BuildSolution"> 
     <Message Text="BuildSolution Started" Importance="high" /> 
      <MSBuild Projects="$(Solution)" Properties="Configuration=Debug" /> 
     <Message Text="BuildSolution Ended" Importance="high" /> 
    </Target> 

    <Target Name="SpecFlow"> 
     <Message Text="SpecFlow Started" Importance="high" /> 
      <Exec Command='SpecFlow generateall "$(CSProject)"' /> 
     <Message Text="SpecFlow Ended" Importance="high" /> 
    </Target> 

    <Target Name="BuildProject"> 
     <Message Text="BuildProject Started" Importance="high" /> 
      <MSBuild Projects="$(CSProject)" Properties="Configuration=Debug" /> 
     <Message Text="BuildProject Ended" Importance="high" /> 
    </Target> 

    <Target Name="NUnit"> 
     <Message Text="NUnit Started" Importance="high" /> 
      <Exec Command='NUnit /run "$(DLL)"' /> 
     <Message Text="NUnit Ended" Importance="high" /> 
    </Target> 
</Project> 

SpecFlow任務查找.csproj文件並創建一個SpecFlowFeature1.feature.cs。 構建.csproj時需要包含此文件,以便NUnit可以使用它。

我知道我可以修改(直接或在副本上).csproj文件以包含生成的文件,但我寧願避免這種情況。

我的問題是:有沒有辦法使用MSBuild任務來建立項目文件,並告訴它包括一個額外的文件包含在構建?

謝謝。

回答

1

我想不出任何方式來實現沒有任何修改.csproj文件。

我建議的方法看起來像這樣。

在你的.csproj你Import容器目標文件

... 
<Import Project="SpecFlow.target" /> 
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
... 

只是CSharp.targets以上。

Specflow.targets看起來像這樣

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <Compile Include="@(Compile)" /> 
    </ItemGroup> 
</Project> 

所以在構建從VS.項目並不會損害

然後,您可以使用您的SpecFlowExec的輸出,並把它添加到SpecFlow.targets文件

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemGroup> 
     <Compile Include="@(Compile)" /> 
     <Compile Include="SpecFlowFeature1.feature.cs" /> 
    </ItemGroup> 
</Project> 

...

和清潔SpecFlow.targets建立你的.csproj後。

3

我發現沒有辦法做到這一點,而無需編輯項目文件。通過SpecFlow

  • 將項目文件
  • 運行副本
  • 添加新:

    所以我做了一個MSBuild文件。CS文件複製的項目

  • 通過NUnit的
  • 清潔編譯項目
  • 調試運行每個編譯的DLL達 - 刪除複製項目

我的博客上講述如何在這裏使用它:

http://learntdd.wordpress.com/2010/06/10/using-specflow-and-nunit-on-visual-studio-2010-express/

(它的第1版,我想提高腳本)

+0

我閱讀了您的博客文章,並遵循了所有步驟,但它對我無效。作爲一個例子,我使用Tekpub MVC初學者網站,它不起作用。我得到的錯誤是: 「C:\ WebTest \ VS2010ExpressSpecFlow.xml」(默認目標)(1) - > (AddSpecFlowCSFilesToProject target) - > C:\ WebTest \ VS2010ExpressSpecFlow.xml(86,5):error : 你調用的對象是空的。 – WVDominick 2010-06-21 14:33:58

+0

+1需要時間來做到這一點。 – WVDominick 2010-06-21 14:34:30

+0

謝謝你的去處,讓人們碰到它就是我需要的。我會在有空的時候儘快看看......大概是這個週末。 – 2010-06-24 09:19:06

相關問題