有什么方法可以告诉MSBuild 4.0构建目标,但忽略任何依赖项?我只想自己建立这个目标,没有别的。
答案 0 :(得分:44)
我想重申@ EMP的解决方案(由于我的声誉很低,我不能投票给他。)
避免MSBuild重建项目文件中列出的所有依赖项的默认行为的正确方法是将BuildProjectReferences
属性设置为false。
在他的回答中,他从MSBuild脚本中调用MSBuild;这是命令行的一个例子:
MSBuild myproj.csproj /p:Configuration=Debug /p:BuildProjectReferences=false /t:Build
答案 1 :(得分:14)
事实证明,内置的Build
目标会检查名为BuildProjectReferences
的属性,以判断是否构建引用。我确实需要在项目本身上运行Build(否则它不起作用),而不是它的依赖项。我最后打电话给:
<MSBuild Projects="MyCloudProject.ccproj" Targets="CorePublish" Properties="Configuration=$(Configuration); BuildProjectReferences=false" />
答案 2 :(得分: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上提交一个描述你要做什么的bug,MSBuild的人可以对这种事情做出很好的响应(随着时间的推移)。
答案 3 :(得分:1)
这取决于你想要建立的目标 如果目标是内置的并且具有依赖性(如“Build”),则无法删除依赖项 如果它是您自己的目标,您可以轻松实现它:
<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>
答案 4 :(得分:1)
通常使用属性指定目标的依赖项,例如:
<Target Name="Foo" DependsOnTargets="$(FooDependsOn)">..</Target>
在这种情况下,您可以调用msbuild作为
msbuild bar.proj /p:FooDependsOn=
将该属性设置为空,因此没有依赖项。