如何获得ClickOnce发布版本以匹配AssemblyInfo.cs文件版本?
每次我在ClickOnce中发布应用程序时,都会得到将其修订号更新1的信息。有没有一种方法可以自动进行此更改以更改AssemblyInfo.cs文件中的版本号(我们所有的错误报告都将查看Assembly版本)?
解决方案
回答
我们可能需要创建一段代码,以根据.csproj文件中存储的版本号更新AssemblyInfo.cs。 (ClickOnce部署版本存储在XML标记内。)
然后,我们将更改.csproj文件,以在执行"发布|发布"构建时运行此代码。 MSBuild的人已经在博客上发表了关于如何在某些构建类型期间执行自定义操作的博文。查看MSBuild团队博客。
回答
脚步:
- 使用外部递增版本号(如果我们使用诸如CruiseControl.NET之类的持续集成服务器,则它来自构建标签)。
- 使用GlobalVersionInfo.cs(解决方案中所有项目所引用的文件链接)来保存当前版本,并使用MSBuild Community任务中的AssemblyInfo任务在构建中对其进行更新。
- .NET SDK中的Script Mage命令行工具,使用相同版本来更新ClickOnce清单(请参见-v和-mv开关)。
顺便说一句,一个不错的好处是,每当我们通过集成脚本自动发布较新的ClickOnce部署版本时,如果我们还为mage.exe指定了最低版本(与版本相同),则每个用户都将在下一个应用程序上自动更新发射。
回答
我们使用Team Foundation Server Team Build,并在TFSBuild.proj的AfterCompile
目标中添加了一个块,以触发具有我们首选版本号的ClickOnce发布:
<MSBuild Projects="$(SolutionRoot)\MyProject\Myproject.csproj" Properties="PublishDir=$(OutDir)\myProjectPublish\; ApplicationVersion=$(PublishApplicationVersion); Configuration=$(Configuration);Platform=$(Platform)" Targets="Publish" />
" PublishApplicationVersion"变量是由自定义MSBuild任务生成的,以使用TFS变更集编号,但是我们可以使用自己的自定义任务或者现有的解决方案,从AssemblyInfo文件中获取版本号。
从理论上讲,这可以在项目文件中完成(无论如何,这只是一个MSBuild脚本),但是我建议我们不要从开发人员机器进行部署。
我确信其他持续集成(CI)解决方案也可以类似地处理此问题。
编辑:对不起,让问题倒退。从ClickOnce版本号转到AssemblyInfo文件应该是可行的。我确定MSBuild社区任务(上面的链接)具有用于更新AssemblyInfo文件的任务,因此我们只需要一个自定义任务即可从ClickOnce配置XML中提取版本号。
但是,我们也可以考虑将错误报告更改为也包括ClickOnce发布版本:
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) { Debug.WriteLine(System.Deployment.Application.ApplicationDeployment. CurrentDeployment.CurrentVersion); }
回答
我最近使用一些自定义任务实现了这一点。我发现使用ClickOnce实施此操作时遇到的问题是,所有DLL文件都已更新。这将导致ClickOnce更新在每次更新时下载所有应用程序文件。这绕过了ClickOnce部署的出色功能,在这些功能中,只有经过修改的文件才在更新中重新下载。
在使用ClickOnce实施此类操作时,只需要考虑一下。