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 中的数字在编译之前。
我一直在尝试更新我的 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 中的数字在编译之前。