Visual studio 如何在导入前计算MSBuild属性

Visual studio 如何在导入前计算MSBuild属性,visual-studio,msbuild,Visual Studio,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"> <Proper

考虑这两个文件。首先
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>
<?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
)。这意味着不能将
构建脚本更改为import.xml
文件。问题是,
OutputName
是计算出来的,我需要在导入
build脚本以导入.xml
文件之前将其设置为这个计算出的值。你知道我怎样才能做到这一点吗


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


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

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

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

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

根据您动态更改
OutputName
的要求,可能会有更简单的解决方案。只是不去做。编写自己的自定义构建步骤,将固定输出目录复制到目标目录(使用您的规则进行计算)更为简单


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

问题在于文件
构建脚本中的属性
OutputName
。xml
在整个
构建脚本中用于导入.xml
,在我的示例中,它实际上代表了Visual Studio WiX项目公共目标文件。因此,我需要将依赖于
OutputName
的所有属性移动到我的文件
build script.xml
中的目标中。WiX目标文件与.NET framework目录中的Microsoft.Common.targets类似,非常庞大。希望还有另一个选择。你可以将它移动到InitialTarget中,它将始终评估prio到其他目标,但仅当属性未在其他静态声明中引用时。据我所知,要导入的
生成脚本中的属性求值将在执行
生成脚本.xml
中的初始目标之前进行。然后,
build script to import.xml
中的依赖属性将基于
build script.xml
中的静态值设置值,然后在
build script.xml
中执行初始目标。我可能不会更改导入的目标文件(
build script to import.xml
)。这不是我写的。有很多项目项、项目引用等,我需要发送给您建议的
MSBuild
任务。按照的建议,只需重新声明构建前目标中的所有属性就更容易了。在上一个示例中,我认为
DependsOn
属性不是
Target
元素上的有效属性。它不是那么简单。这看起来像是一个非常脆弱的解决方案,就像我的一样。但这只是变种。我更新了答案,提出了更可靠的解决方案。
 <Target Name="Build" DependsOn="PrepareProperties">
      <MSBuild Projects="build-script-to-import.xml"  
               Targets="Build"            
               Properties="OutputName=$(OutputName);$(OtherProperties)"/>
 </Target>