2011-02-28 25 views

回答

36

我想重申@ EMP的解決方案(我不能投票他,因爲我的小名聲)。

避免重建項目文件中列出的所有依賴項的MSBuild默認行爲的正確方法是將BuildProjectReferences屬性設置爲false。

在他的回答中,他從MSBuild腳本中調用MSBuild;這裏是命令行的一個例子:

MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build 
1

這取決於你想要建立的目標。
如果目標是內置的並且具有依賴關係(如「Build」),則不能刪除依賴關係。
如果這是你自己的目標,你可以很容易地實現它:

<Target Name="YourTargetWithDependencies" 
     DependsOnTargets="YourTargetDependencies;YourTarget"> 
</Target> 

<Target Name="YourTarget" > 
</Target> 

對於CorePublishAzure雲計算項目以及其他任何與可定製DependsOn目標,你可以嘗試改變項目修改默認依賴列表:

<Target Name=CallPublish> 
     <!-- Modified list of dependencies. Build is skipped here. --> 
     <PropertyGroup> 
     <CustomCorePublishDependsOn> 
      PrepareForPackaging; 
      CheckRoleInstanceCount; 
      CopyServiceDefinitionAndConfiguration; 
      ConfigureWebDeploy; 
      IntelliTrace; 
     </CustomCorePublishDependsOn> 
     </PropertyGroup> 

     <MSBuild Projects="$(MSBuildProjectFullPath)" 
       Targets="CorePublish" 
       Properties="CorePublishDependsOn=$(CustomCorePublishDependsOn);Configuration=$(Configuration);Platform=$(Platform)"> 
</Target> 
+0

是的,它是一個內置的,當然。 – EMP 2011-02-28 09:14:25

+0

@Evgeny,你能指定它嗎? – 2011-02-28 09:33:47

+0

它是.ccproj項目上的CorePublish目標。當然,我可以手動進行內部的任何操作,我只是想知道是否有更好的方法。 – EMP 2011-02-28 11:00:53

1

通常一個目標的依賴與屬性指定的,例如:

<Target Name="Foo" DependsOnTargets="$(FooDependsOn)">..</Target> 

在可以調用的MSBuild作爲

msbuild bar.proj /p:FooDependsOn= 

它設置該屬性不了了之,所以沒有依賴這種情況。

3

也許可以重寫內置目標,添加自己的條件,並讓目標複製原始內容,但這可能會相當複雜。如果你可以追蹤一個獨立的內置目標,這可以被維護。有時候這些「核心」目標不過是一個DependsOnTargets列表,有時甚至是在一個屬性中定義的,所以重寫它並添加一個缺失的條件是微不足道的。有時候,雖然你需要做一個大的剪切和粘貼來讓它正確。

基本上,MSBuild將只維護任何給定名稱的最後一個目標定義,因此找到您的項目導入包含要覆蓋的目標的.target文件的位置,然後將自己的.target文件導入包含在它之後重寫。

例如,添加的條件從Microsoft.Common.targets了「CoreBuild」目標是,因爲這容易,同時保持相同的行爲,否則(與$(SkipCoreBuild)以下屬性的目標條件):

<Target 
    Name="CoreBuild" 
    Condition="'$(SkipCoreBuild)' != 'true'" 
    DependsOnTargets="$(CoreBuildDependsOn)"> 

    <OnError ExecuteTargets="_TimeStampAfterCompile;PostBuildEvent" 
     Condition="'$(RunPostBuildEvent)'=='Always' or 
      '$(RunPostBuildEvent)'=='OnOutputUpdated'" 
     /> 
    <OnError ExecuteTargets="_CleanRecordFileWrites" /> 
</Target> 

放置在上面自己的目標,文件和標準後,C#項目導入它...

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

...將覆蓋沒有你所需要的條件的默認實現選擇性地禁用它。

在任何情況下,如果您發現不允許您修改條件的目標,我會在Connect上描述您正在嘗試執行的操作,MSBuild人員可以對這種(隨着時間的推移)。

13

事實證明,內置的Build目標會檢查名爲BuildProjectReferences的屬性來判斷是否構建引用。我確實需要在項目本身上運行Build(否則它不起作用),而不是它的依賴關係。我結束了電話:

<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />