有什么方法可以告诉 MSBuild 4.0 构建目标,但忽略任何依赖项?我只想自己构建那个目标,没有别的。
5 回答
我想重申@EMP 的解决方案(由于我的名声不好,我不能投票给他)。
避免 MSBuild 重新构建项目文件中列出的所有依赖项的默认行为的正确方法是将BuildProjectReferences
属性设置为 false。
在他的回答中,他从 MSBuild 脚本中调用了 MSBuild;这是命令行中的一个示例:
MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build
事实证明,内置Build
目标会检查一个名为的属性BuildProjectReferences
,以判断是否构建引用。我确实需要在项目本身上运行 Build(否则它不起作用),而不是在它的依赖项上。我最终打电话给:
<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />
可能会覆盖内置目标,添加您自己的条件,并让您的目标复制原始目标,但这可能会相当复杂。如果您可以跟踪单个依赖的内置目标,则可以进行维护。有时,这些“核心”目标仅由 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 人员可能会对这类事情做出相当大的反应(随着时间的推移)。
这取决于您要构建的目标。
如果目标是内置的并且具有依赖项(如“构建”),则无法删除依赖项。
如果它是您自己的目标,您可以轻松实现它:
<Target Name="YourTargetWithDependencies"
DependsOnTargets="YourTargetDependencies;YourTarget">
</Target>
<Target Name="YourTarget" >
</Target>
对于Azure 云计算项目中的CorePublish以及任何其他具有可自定义 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>
通常一个目标的依赖是用一个属性来指定的,例如:
<Target Name="Foo" DependsOnTargets="$(FooDependsOn)">..</Target>
在这种情况下,您可以调用 msbuild 作为
msbuild bar.proj /p:FooDependsOn=
它将该属性设置为空,因此没有依赖关系。