2008-09-04 63 views

回答

30

我们使用Team Foundation Server的团队建设和增加了一个块到TFSBuild.proj的AfterCompile目标触发的ClickOnce我们的首选版本号发布:

<MSBuild Projects="$(SolutionRoot)\MyProject\Myproject.csproj" 
     Properties="PublishDir=$(OutDir)\myProjectPublish\; 
        ApplicationVersion=$(PublishApplicationVersion); 
        Configuration=$(Configuration);Platform=$(Platform)" 
     Targets="Publish" /> 

通过自定义的MSBuild生成的PublishApplicationVersion变量任务使用TFS Changeset编号,但您可以使用your own custom taskexisting solution从AssemblyInfo文件中获取版本编号。

这理论上可以在你的项目文件中完成(这只是一个MSBuild脚本),但我建议不要从开发人员机器部署。

我相信其他continuous integration(CI)解决方案可以类似地处理。


编辑:对不起,有你的问题倒退。从ClickOnce版本号到AssemblyInfo文件应该是可行的。我确信MSBuild社区任务(上面的链接)有更新AssemblyInfo文件的任务,所以您只需要一个自定义任务即可从ClickOnce配置XML中获取版本号。

不过,您也可以考虑改变你的错误报告,包括ClickOnce的发布版本太多:

if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed) 
{ 
    Debug.WriteLine(System.Deployment.Application.ApplicationDeployment. 
                 CurrentDeployment.CurrentVersion); 
} 
0

您可能需要创建一段代码,根据存储在.csproj文件中的版本号更新AssemblyInfo.cs。 (ClickOnce部署版本存储在XML标记中。)

然后,您将在执行发布|发布构建时更改.csproj文件以运行此位代码。 MSBuild人员已经在博客中介绍了如何在某些构建类型中执行自定义操作;检查MSBuild team blog

2

步骤:

  1. 使用外部递增版本号(如果你利用诸如CruiseControl.NET持续集成服务器,那么它来自内部版本标签)。
  2. 使用GlobalVersionInfo.cs(由解决方案中所有项目引用的文件)来保存当前版本,并使用MSBuild Community任务中的AssemblyInfo任务对其进行更新。
  3. 脚本Mage从.NET SDK命令行工具来更新的ClickOnce清单中,使用相同的版本(见-v-mv开关)。

顺便说一句,一个不错的奖金是,每当你自动通过集成脚本发布一个更新的ClickOnce部署版本,如果您还指定的最低版本mage.exe(同版),那么每个用户将在下次应用程序启动时自动更新。

4

我实现了这个最近使用一些自定义任务。我发现用ClickOnce实现这个问题是所有的DLL文件都被更新了。这会导致ClickOnce更新在每次更新时下载所有应用程序文件。这绕过了ClickOnce部署的好处,其中只有修改后的文件在更新中被重新下载。

在ClickOnce中实现类似的东西时,需要思考一些问题。