2011-02-28 59 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" />