2012-02-23 96 views
1

我有一個構建任務,我想包括到我的msbuild腳本。我希望CI先編譯構建任務,然後再嘗試使用它們,以便添加的任何新構建任務都可以使用,並且實際組裝不必編譯並提交給機器CI。我嘗試過這樣的事情。msbuild可以編譯構建任務然後使用它們嗎?

<Target Name="SetupEnv"> 
    <MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" /> 
     <UsingTask TaskName="Foo.BarTask" AssemblyFile="$(MSBuildProjectDirectory)\BuildTasks\FooBuildTasks\bin\Release\FooBuildTasks.dll"/> 
    <BarTask Variable="Test" Value="I'm Alive" /> 
    </Target> 

此生成任務彙編文件,但隨後似乎像UsingTask任務不能在目標運行。

錯誤MSB4036:未找到「UsingTask」任務。檢查 以下內容:1)項目文件中任務的名稱是...

有沒有什麼好的解決方案呢?如果我運行UsingTask項目它工作正常,如果我預先編譯任務程序集。

使用的MSBuild的平臺是3.5

回答

2

你需要兩個步驟構建之外聲明或使用內聯任務。兩步構建涉及將構建分解爲預配置構建任務的「配置」目標和執行構建的「CoreBuild」目標。

使用下面的任一技巧,您需要確保您的「Confugure」目標不需要您構建的任何自定義任務。

1)用你的「生成」目標驅動兩個步驟構建:

<Target Name="Configure"> 
    <MSBuild Projects="PathTo/CustomBuidTasks.csproj" Target="Build" /> 
</Target> 

<Target Name="CoreBuild"> 
    <MSBuild Projects="@(ItemsToBuild)" Target="Build" /> 
</Target> 

<Target Name="Build"> 
    <MSBuild Projects="$(MSBuildThisFile)" Target="Configure" /> 
    <MSBuild Projects="$(MSBuildThisFile)" Target="CoreBuild" /> 
</Target> 

2)設置你的CI系統執行兩步爲您構建,essentually重複上述使用CI工作流,首先用「配置」目標執行MSBuild,然後單獨執行更傳統的「構建」目標。

3)另一種方法是在MSBuild中使用內聯任務。通過將任務代碼放入MSBuild文件中,引擎會在任務第一次執行時爲您編譯它。

摘自MSBuild Trickery技巧#6和#32

+0

兩步法似乎是最簡單的一步,因爲任務非常複雜,並且可能不適合內聯。我會盡快完成。 – inquam 2012-02-23 21:05:26

+0

如果您的主項目文件不在您運行MSBuild的同一文件夾中,則需要使用$(MSBuildThisFileDirectory)/ $(MSBuildThisFile)。 – 2012-02-24 15:34:56

2

設置OutDir屬性明確:

<MSBuild Targets="Build" Projects="FooBuildTasks\BuildTasks.sln" 
      Properties="Configuration=Release;OutDir=$(MSBuildProjectDirectory)\BuildTasks\FooBuildTasks\bin\Release\" /> 

此外,<UsingTask>元素必須在<Target>

+0

構建按預期工作。唯一的問題是如何讓msbuild腳本構建它將要使用的構建任務。 – inquam 2012-02-23 21:04:49

相關問題