csproj 中的 MSBuild 更新 属性

MSBuild Update property in csproj

我一直在尝试更新我的 csproj file.witch 中的 ApplicationVersion 属性 工作正常;我添加了一个 运行 自定义任务的目标,用于从我的 assemblyinfo.cs 中提取 AssemblyFileVersion;毫无疑问,这是有效的。 但是当我想使用我更新的 ApplicationVersion 来确定将我的新构建文件放在哪里时,我得到了 属性.

中设置的默认值
<PropertyGroup>
        ...
        <ApplicationVersion>1.0.0.0</ApplicationVersion>
        ...
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <PlatformTarget>AnyCPU</PlatformTarget>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <OutputPath>..\media-converter-BUILD\debug$(ApplicationVersion)\</OutputPath>
        <DefineConstants>DEBUG;TRACE</DefineConstants>
        <ErrorReport>prompt</ErrorReport>
        <WarningLevel>4</WarningLevel>
        <DocumentationFile>..\media-converter-BUILD\debug$(ApplicationVersion)\MediaConverter.XML</DocumentationFile>
    </PropertyGroup>

我的目标

<UsingTask AssemblyFile="GetAssemblyFileVersion.dll" TaskName="GetAssemblyFileVersion.GetAssemblyFileVersion" />
    <Target Name="MainAfterCompile">
        <CallTarget Targets="AfterCompile" />
        <CallTarget Targets="VerifyParam" />
    </Target>
    <Target Name="AfterCompile">
        <GetAssemblyFileVersion strFilePathAssemblyInfo="Properties\AssemblyInfo.cs">
            <Output TaskParameter="strAssemblyFileVersion" PropertyName="ApplicationVersionModded" />
        </GetAssemblyFileVersion>
        <PropertyGroup>
            <ApplicationVersion>$(ApplicationVersionModded)</ApplicationVersion>
        </PropertyGroup>
    </Target>

    <Target Name="VerifyParam">
        <Message Text="New $(ApplicationVersionModded)" Importance="high"/>
        <Message Text="Old Updated $(ApplicationVersion)" Importance="high"/>
    </Target>

GetAssemblyFileVersion.dll我或多或少偷了一些我在网上找到的post,只是找不到了,所以我可以'添加一个link,抱歉。

我认为它不起作用的原因是 PropertyGroups 中的转换和参数在 InitailTagets 和 DefaultTargets 之前呈现 运行。而且我的计划永远不会奏效

但是如果有人知道让它工作的方法,我将不胜感激

我关于它为什么不起作用的理论是 PropertyGroups 中的转换和参数在 InitailTagets 和 DefaultTargets 之前呈现 运行 事实上,这就是 evaluation order 有效:msbuild 在文件的第一遍中评估全局属性,您定义 OutputPath,Microsoft.Common.CurrentVersion.targets 文件使用它来派生 OutDir/BaseIntermediateOutputPath/.... 然后在另一遍中你目标 运行 并更新版本号,但没有另一遍再次评估全局 OutputPath 属性。

然而,您可以覆盖目标中的 OutputPath 和派生路径的值,它会生效,您只需要在构建的早期注意 运行 使其生效,以便其他目标使用更新后的版本。这就是诀窍:

<Target Name="GetApplicationVersion">
  <GetAssemblyFileVersion strFilePathAssemblyInfo="Properties\AssemblyInfo.cs">
    <Output TaskParameter="strAssemblyFileVersion" PropertyName="ApplicationVersion" />
  </GetAssemblyFileVersion>
</Target>
<Target Name="SetOutputPaths" DependsOnTargets="GetApplicationVersion"
        BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <OutputPath>bin$(Configuration)$(ApplicationVersion)\</OutputPath>
    <OutDir>$(OutputPath)</OutDir>
  </PropertyGroup>
  <Message Text="Set OutDir to $(OutDir)" Importance="high" />
</Target>

另一种处理方法是反过来做:将应用程序版本定义为全局 msbuild 属性,然后使用它来定义 OutputPath 并更新 AssemblyVersion.cs 中的数字在编译之前。