0

考虑这两个MSBuild文件。首先build-script.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- build-script.xml -->
<Project
    ToolsVersion="4.0"
    DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <OutputName>OutputName</OutputName>
    </PropertyGroup>

    <Import Project="build-script-to-import.xml"/>
</Project>

然后build-script-to-import.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- build-script-to-import.xml -->
<Project
    ToolsVersion="4.0"
    DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <OutputPath>Path\$(OutputName)</OutputPath>
    </PropertyGroup>

    <Target Name="Build">
        <Message Text="$(OutputPath)" />
    </Target>
</Project>

这两个文件代表一个非常简化的 C# 项目文件 ( build-script.xml),它引用了一个公共目标文件 ( build-script-to-import.xml)。这意味着它不是更改build-script-to-import.xml文件的选项。问题是OutputName计算出来的,我需要在导入build-script-to-import.xml文件之前将它设置为这个计算值。你知道我怎么能做到这一点吗?


注意 1:计算的值实际上是一个程序集版本,我可以使用GetAssemblyIdentityMSBuild 任务从程序集文件中获取它。我看到的问题是在导入发生之前我可能不会调用目标。我想在MSBuild 任务OutputName的帮助下设置属性的值。GetAssemblyIdentity

注意 2:构建将由 Visual Studio 触发,因此我可能不会使用批处理文件并将属性作为命令行参数发送到 MSBuild。

4

2 回答 2

0

如果导入项目中的相应目标允许修改DependsOnTargets

<Target Name="Build" DependsOnTargets="@(BuildDependsOn)" />

您可以修改项目并添加您的目标,这将准备所需的属性。

如果不可能,您可以编写包装器来自己调用底层目标/目标(Build/Rebuild/Clean)(无需导入build-script-to-import.xml):

构建脚本.xml

 <Target Name="Build" DependsOn="PrepareProperties">
      <MSBuild Projects="build-script-to-import.xml"  
               Targets="Build"            
               Properties="OutputName=$(OutputName);$(OtherProperties)"/>
 </Target>

建议

取决于您对动态更改的要求,OutputName可能会有更简单的解决方案。只是不要这样做。编写您自己的自定义构建步骤以从固定输出目录复制到您的目的地,这是相当简单的,这是使用您的规则计算的。

例如,当我有一个名为latest的具有固定路径的目录和每个产品版本的目录时,我更喜欢练习。每个人都可以从该文件夹中获取最新版本。

于 2012-08-14T22:50:21.203 回答
0

在“构建”目标中移动 $(OutputPath) 的声明。使用“计算”​​属性的唯一方法是让它们在目标内部进行评估。全局声明的“静态”属性将始终在任何目标运行之前进行评估,并且您可能需要运行一个目标来计算 $(OutputName) 的值。只需确保您的名称计算目标在“构建”目标之前运行。

于 2012-08-14T19:09:20.403 回答