C# - 无法从 MSBuild 脚本更改 ApplicationVersion
C# - Unable to change ApplicationVersion from MSBuild script
我是一名新手,试图通过 MS Office 加载项上的 AssemblyVersion 修改发布的 ApplicationVersion 值。
这是我的 csproj :
<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
当我从 Visual Studio 2015 年发布应用程序时,日志显示正确的版本:
app Version : 4.4.9.0
但实际上使用的是VS中定义的ApplicationVersion :
<ApplicationVersion>1.0.0.0</ApplicationVersion>
我已经试过了:
- 重置所有 VS 设置
- 禁用任何第三方扩展
- 使用安全模式
- 如果我发布一个 WPF 应用程序,它运行良好
有人知道我为什么要进行此更改吗?
更新
经过一些测试,我发现 MSBUILD 使用不同的 VSTO 目标文件:MSBuild\Microsoft\VisualStudio\v14.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets。
它似乎使用 PublishVersion,它是 ApplicationVersion 的副本。我不知道为什么,但如果我在我的目标中设置 ApplicationVersion,它不会更新 PublishVersion...如果我设置 publishVersion,我会在我的 bin 文件夹中获得好的版本,但发布失败(不要复制发布文件夹,因为它仍然想获取 bin 中带有 1_0_0_0 的文件夹)。
启动我的目标可能是错误步骤的问题,但我不知道什么时候必须完成。
有什么帮助吗?
更新 2
这似乎是 VS2015 发布工具的一个错误。如果我尝试使用 msbuild.exe 命令行,它运行良好:
在 VS 上,我收到一个错误,要求提供以下文件夹:
而使用以下 msbuild 命令,它可以工作:
MSBuild xxx\ExcelAddIn1\ExcelAddIn1\ExcelAddIn1.csproj /t:clean;publish
有谁知道解决方法是什么?
首先,我有一个问题,当我在winform项目中使用你的代码并执行发布时,我得到了这样的错误:
我测试后发现
你得到的ApplicationVersion
是非法的三位数,不是四位数,所以你获取AssemblyVersion
.
的方法有问题
一般,发布版本在Project Properties下(right-click on your project)-->发布
你可以注意到它是四位数字。
这证明你错过了 Pattern
属性 上的一个节点。
建议
你应该使用
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
全部代码为:
<Target Name="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
</Target>
它将从 AssemblyInfo.cs
文件中读取 AssemblyVersion
。
在我身边,是
实际上,您的方法已经有效,它会覆盖应用程序的发布版本。
我认为您已经阅读了构建输出日志的第一部分,如下所示:
只是build开始时默认的系统初始值,只是显示在那里而已。然后通过您的自定义 msbuild 脚本实际上已经覆盖了它的值。
在执行publish之前,先删除publish
文件夹,bin
和obj
文件夹,然后执行publish,可以进入文件夹查看:
更新 1
我认为您的 csproj 文件导入了一些目标或 props 文件,其中其他目标覆盖了 AfterCompile
目标。所以你的方法失败了。
也就是说,你的方法可能在其他地方被覆盖了。
所以我认为您不应该使用 AfterCompile 作为目标名称,而应该将其命名为另一个以区分它们。
使用这个:
<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
</Target>
或,您可以在项目文件夹中添加一个名为Directory.Build.targets
的文件
然后在上面添加我的代码:
<Project>
<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
</Target>
</Project>
然后,删除bin
,obj
,publish
文件夹,然后重新发布检查一下。
如果问题仍然存在,您应该尝试以下建议来解决问题:
1) 尝试通过工具-->导入和导出设置[=154=重置vs设置]-->重置所有vs设置
2) 在工具-->扩展和更新[=154=下禁用任何与第三方扩展] -->已安装,安装完成后,关闭VS,重启工程。
3) 您可以尝试 devenv /safemode 在 VS2015 的开发人员命令提示符上启动一个纯粹的初始 vs 来测试您的解决方案。
============================================= ==
更新 2
MS Office Excel AddIn 项目与传统项目有很大不同。而且用这种方式是不可能的。
作为解决方法,我认为您应该使用 msbuild 脚本来发布项目。
1) 创建一个名为 PublishExcel.proj
的文件
2) 在该文件中添加这些内容:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="SetAssemblyVersionToPublish">
<!--you must specify the full path of the AssemblyInfo.cs from your project -->
<ReadLinesFromFile File="C:\Users\xxx\Documents\Visual Studio 2015\Projects\ExcelAddIn1\ExcelAddIn1\Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
<MSBuild Projects="C:\Users\Administrator\Documents\Visual Studio 2015\Projects\ExcelAddIn1\ExcelAddIn1\ExcelAddIn1.csproj" Properties="ApplicationVersion=$(ApplicationVersion)" Targets="Publish">
</MSBuild>
</Target>
</Project>
3) 然后打开 VS2015 的开发人员命令提示符,然后键入:
msbuild xxx\xxx\PublishExcel.proj -t:SetAssemblyVersionToPublish
和发布文件夹将在bin\Debug或Release\app.publish文件夹下。
此功能适用于 MS Office Excel AddIn 项目。
我是一名新手,试图通过 MS Office 加载项上的 AssemblyVersion 修改发布的 ApplicationVersion 值。 这是我的 csproj :
<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
当我从 Visual Studio 2015 年发布应用程序时,日志显示正确的版本:
app Version : 4.4.9.0
但实际上使用的是VS中定义的ApplicationVersion :
<ApplicationVersion>1.0.0.0</ApplicationVersion>
我已经试过了:
- 重置所有 VS 设置
- 禁用任何第三方扩展
- 使用安全模式
- 如果我发布一个 WPF 应用程序,它运行良好
有人知道我为什么要进行此更改吗?
更新
经过一些测试,我发现 MSBUILD 使用不同的 VSTO 目标文件:MSBuild\Microsoft\VisualStudio\v14.0\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets。 它似乎使用 PublishVersion,它是 ApplicationVersion 的副本。我不知道为什么,但如果我在我的目标中设置 ApplicationVersion,它不会更新 PublishVersion...如果我设置 publishVersion,我会在我的 bin 文件夹中获得好的版本,但发布失败(不要复制发布文件夹,因为它仍然想获取 bin 中带有 1_0_0_0 的文件夹)。 启动我的目标可能是错误步骤的问题,但我不知道什么时候必须完成。
有什么帮助吗?
更新 2
这似乎是 VS2015 发布工具的一个错误。如果我尝试使用 msbuild.exe 命令行,它运行良好:
在 VS 上,我收到一个错误,要求提供以下文件夹:
而使用以下 msbuild 命令,它可以工作: MSBuild xxx\ExcelAddIn1\ExcelAddIn1\ExcelAddIn1.csproj /t:clean;publish
有谁知道解决方法是什么?
首先,我有一个问题,当我在winform项目中使用你的代码并执行发布时,我得到了这样的错误:
我测试后发现
你得到的ApplicationVersion
是非法的三位数,不是四位数,所以你获取AssemblyVersion
.
一般,发布版本在Project Properties下(right-click on your project)-->发布
你可以注意到它是四位数字。
这证明你错过了 Pattern
属性 上的一个节点。
建议
你应该使用
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
全部代码为:
<Target Name="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
</Target>
它将从 AssemblyInfo.cs
文件中读取 AssemblyVersion
。
在我身边,是
实际上,您的方法已经有效,它会覆盖应用程序的发布版本。
我认为您已经阅读了构建输出日志的第一部分,如下所示:
只是build开始时默认的系统初始值,只是显示在那里而已。然后通过您的自定义 msbuild 脚本实际上已经覆盖了它的值。
在执行publish之前,先删除publish
文件夹,bin
和obj
文件夹,然后执行publish,可以进入文件夹查看:
更新 1
我认为您的 csproj 文件导入了一些目标或 props 文件,其中其他目标覆盖了 AfterCompile
目标。所以你的方法失败了。
也就是说,你的方法可能在其他地方被覆盖了。
所以我认为您不应该使用 AfterCompile 作为目标名称,而应该将其命名为另一个以区分它们。
使用这个:
<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
</Target>
或,您可以在项目文件夹中添加一个名为Directory.Build.targets
的文件
然后在上面添加我的代码:
<Project>
<Target Name="SetAssemblyVersionToPublish" AfterTargets="AfterCompile">
<ReadLinesFromFile File="Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
</Target>
</Project>
然后,删除bin
,obj
,publish
文件夹,然后重新发布检查一下。
如果问题仍然存在,您应该尝试以下建议来解决问题:
1) 尝试通过工具-->导入和导出设置[=154=重置vs设置]-->重置所有vs设置
2) 在工具-->扩展和更新[=154=下禁用任何与第三方扩展] -->已安装,安装完成后,关闭VS,重启工程。
3) 您可以尝试 devenv /safemode 在 VS2015 的开发人员命令提示符上启动一个纯粹的初始 vs 来测试您的解决方案。
============================================= ==
更新 2
MS Office Excel AddIn 项目与传统项目有很大不同。而且用这种方式是不可能的。
作为解决方法,我认为您应该使用 msbuild 脚本来发布项目。
1) 创建一个名为 PublishExcel.proj
2) 在该文件中添加这些内容:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="SetAssemblyVersionToPublish">
<!--you must specify the full path of the AssemblyInfo.cs from your project -->
<ReadLinesFromFile File="C:\Users\xxx\Documents\Visual Studio 2015\Projects\ExcelAddIn1\ExcelAddIn1\Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyVersion" />
</ReadLinesFromFile>
<PropertyGroup>
<In>@(AssemblyVersion)</In>
<Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
<Out>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern)))</Out>
<ApplicationVersion>$(Out.Remove(0, 28))</ApplicationVersion>
</PropertyGroup>
<Message Text="app Version : $(ApplicationVersion)" Importance="High" />
<MSBuild Projects="C:\Users\Administrator\Documents\Visual Studio 2015\Projects\ExcelAddIn1\ExcelAddIn1\ExcelAddIn1.csproj" Properties="ApplicationVersion=$(ApplicationVersion)" Targets="Publish">
</MSBuild>
</Target>
</Project>
3) 然后打开 VS2015 的开发人员命令提示符,然后键入:
msbuild xxx\xxx\PublishExcel.proj -t:SetAssemblyVersionToPublish
和发布文件夹将在bin\Debug或Release\app.publish文件夹下。
此功能适用于 MS Office Excel AddIn 项目。