MSBuild动态导入项目

时间:2013-11-13 15:35:16

标签: msbuild

在我的.csproj上,我想根据从任务计算的路径导入.target文件。

是否可以做这样的事情?

<PropertyGroup>
    <TargetPath>/*Some calculation from task*/</TargetPath>
</PropertyGroup>


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

我尝试从另一个目标执行此操作,但由于在目标评估之前调用了导入,因此无效。

2 个答案:

答案 0 :(得分:3)

在导入目标之前无法调用目标,但仍可以动态生成从属性组导入的路径。

Visual Studio在您创建Web项目时执行此操作,如本示例中的一个项目所示:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">12.0</VisualStudioVersion>
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\WebApplications\Microsoft.WebApplication.targets" />

所以你绝对可以使用条件来定义属性:

<PropertyGroup>
  <ImportPath Condition="Exists('path\to\some\thing.targets')">path\to\some\thing.targets</ImportPath>
</PropertyGroup>
<Import Project="$(ImportPath)" Condition=" '$(ImportPath)' != '' "/>

Microsoft.Bcl.Build这样做,所以你也可以。

答案 1 :(得分:1)

不,首先,MSBuild导入所有“扩展”,然后构建依赖图,最后运行任务