生成没有依赖项的MSBuild目标

生成没有依赖项的MSBuild目标,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,是否有任何方法可以让MSBuild 4.0生成目标,但忽略任何依赖项?我只想建立目标本身,没有别的。这取决于你想要建立的目标。 如果目标是内置的且具有依赖项(如“Build”),则无法删除依赖项。 如果这是您自己的目标,您可以轻松实现: <Target Name="YourTargetWithDependencies" DependsOnTargets="YourTargetDependencies;YourTarget"> </Target> <

是否有任何方法可以让MSBuild 4.0生成目标,但忽略任何依赖项?我只想建立目标本身,没有别的。

这取决于你想要建立的目标。
如果目标是内置的且具有依赖项(如“Build”),则无法删除依赖项。
如果这是您自己的目标,您可以轻松实现:

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

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

对于Azure云计算项目中的CorePublish以及任何其他具有可自定义依赖项目标的项目,您可以尝试更改项目以修改依赖项的默认列表:

<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>

预包装;
CheckRoleInstanceCount;
CopyServiceDefinitionAndConfiguration;
配置webdeploy;
智能跟踪;

通常,目标的依赖项是用属性指定的,例如:

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

它将该属性设置为nothing,因此没有依赖项。

可以覆盖内置目标,添加您自己的条件,并让您的目标复制原始目标,但这可能会涉及到很多问题。如果您可以跟踪单个依赖的内置目标,那么这是可以维护的。有时这些“核心”目标只包含一个DependsOnTargets列表,有时甚至是在属性中定义的目标,因此覆盖它并在缺少它们的地方添加条件是很简单的。有时,你需要做一个大的剪切和粘贴,以得到正确的

基本上,MSBuild将只维护为任何给定名称定义的最后一个目标,因此请查找项目导入包含要覆盖的目标的.target文件的位置,然后将包含覆盖的.target文件导入到该文件之后

例如,从Microsoft.Common.targets向“CoreBuild”目标添加条件与此一样简单,但在其他情况下保持相同的行为(目标条件具有下面的$(SkipCoreBuild)属性):


将上述内容放在您自己的目标文件中,并在标准后将其导入C#项目中

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

。。。将覆盖不具备选择性禁用它所需条件的默认实现


在任何情况下,如果您发现一个目标不允许您修改条件,我会在Connect上提交一个bug,描述您正在尝试做什么,MSBuild人员可能会对这类事情(随着时间的推移)做出相当大的响应.

结果是内置的
生成
目标检查名为
BuildProjectReferences
的属性以判断是否生成引用。我确实需要在项目本身上运行Build(否则它不工作),只是不需要依赖它。我最后打电话:

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

我想重申@EMP的解决方案(由于我的名声不好,我不能投票支持他)

避免MSBuild重建项目文件中列出的所有依赖项的默认行为的正确方法是将
BuildProjectReferences
属性设置为false

在他的回答中,他从MSBuild脚本中调用MSBuild;下面是命令行中的一个示例:

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

它是.ccproj项目的核心发布目标。当然,我可以在内部手动执行任何操作,我只是想知道是否有更好的方法。
<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />
MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build