ClickOnce发布时报错:Cannot publish because a project failed to build
.net程序开发、测试完成后,还有一个很重要的步骤--部署,作为用户,自然是希望越傻瓜化、越人性化越好。.net自带的部署选项有以下几种:
1、 Xcopy 实用工具
2、Copy Web工具
3、发布 Web站点
4、部署项目(又分为四类:创建合并模块;为客户应用程序创建安装程序;为 Web 应用程序创建安装程序; 以及为基于智能设备(Compact Framework)的应用程序创建安装程序。还可以创建 cab文件。)
5、 ClickOnce
前四种方式应用很广泛,本文主要介绍ClickOnce的一次使用过程。
ClickOnce 是一种允许应用程序自动升级的部署技术。应用程序发布到文件共享、Web站点或 CD 这样的媒介上。之后, ClickOnce 应用程序就可以自动升级,而无需用户的干涉。ClickOnce 还解决了安全权限问题。一般情况下,要安装应用程序,用户需要有管理权限。而利用 ClickOnce,用户只要有运行应用程序所需的最低权限,就可以安装和运行。
首先,我们了解一下ClickOnce与普通的windows inStaller程序有何区别:
ClickOnce | Windows Installer | |
应用程序的安装位置 | ClickOnce 应用程序缓存 | Program Files 文件夹 |
给多个用户安装 | 否 | 是 |
安装共享文件 | 否 | 是 |
安装驱动程序 | 否 | 是 |
安装到 GAC 中 | 否 | 是 |
在“启动”组中添加应用程序 | 否 | 是 |
在菜单中添加应用程序 | 否 | 是 |
注册文件类型 | 否 | 是 |
访问注册表 | 否。有访问 HKLM 的 Full Trust 权限 | 是 |
文件的二进制修补 | 是 | 否 |
根据需要安装程序集 | 是 | 否 |
在一些情况下,使用 Windows Installer 比较好,但 ClickOnce 也适用于许多应用程序。 ClickOnce 应用程序会显示在“添加/删除程序”控制面板选项上,这与其他安装的应用程序一样。一个主要区别是用户可以选择卸载应用程序或回退到以前的版本。ClickOnce在 ClickOnce 应用程序缓存中保存以前的版本。
关于Winows Installer的使用,本文略过。下面介绍我的一次ClickOnce的部署过程:
1、创建主程序,并测试成功!
2、创建web程序,并发布主程序到web目录。
web程序的设置,注意部署到IIS中。
主程序的发布选项:
是否创建一个桌面图标:
此时客户可以从这个地址在线安装程序了。web程序目录下生成三个文件:
3、从指定web路径安装程序
4、升级安装程序、回滚安装程序
首先修改主程序,并发而新版本,如下:
发布后用户再次运行主程序,或访问publish.htm时,会收到如下提示:
升级成功后,界面:
此时,控制面板,如下:
此时,选择“更改/删除”可以选择前一个版本或彻底删除,如果选择前一个版本,如下:
5、问题出现:
在项目-右键-属性-发布--发布向导时,提示错误: Cannot publish because a project failed to build.
奇怪!尝试解决方法如下:
一、单独生成项目、重新生成项目、清理项目,删除所有obj及bin目录,均试过,可以生成项目,但发布时出错,如上提示。
二、怀疑是IIS权限问题,给web项目文件夹network service账号所有权限。
三、IE-选项-内容中,清除证书。
四、主动修改了一个新版本,仍然出错。
google成了我的救命稻草,终于找到一条类似的信息,说是用右键直接发布即可。终于成功!如下图:
不正确的方法:
正确的方法:
六、问题分析:
发布选项,其实是调用了vs2010自带的dos命令mage.exe或它的UI程序:mageUI.exe,它主要用来修改相应的application选项。
关于MageUI的说明,请参阅MSDN:http://msdn.microsoft.com/zh-cn/library/xhctdw55%28VS.80%29.aspx
我们可以在程序-Microsoft Visual Studio 2010-Visual Studio Tools-Visual Studio Command Prompt (2010)出现的命令状态中输入mageui.exe,得到如下界面:
其实上面出错的界面,和成功的两个界面,应该都是调用Mage.exe或mageUi.exe,只不过可能是调用时参数不一致而导致出错,这应该是Vs2010 RTM的一个bug。(附:ClickOnce 应用程序有两个基于XML 的清单文件,其中一个是应用程序的清单,另一个是部署清单。这两个文件描述了部署应用程序所需的所有信息。应用程序清单包含的应用程序信息有需要的权限、要包括的程序集和其他从属文件。部署清单包含了应用程序的部署信息。应用程序清单的位置信息包含在部署清单中。)
需要注意:
1、应用程序缓存:用 ClickOnce 发布的应用程序不能安装在 Program Files 文件夹中,它们会放在应用程序缓存中,应用程序缓存位于当前用户的 Document’s and Settings文件夹的 Local Settings子文件夹下。控制部署的这个功能,可以把应用程序的多个版本同时放在客户机上。如果应用程序设置为在线运行,就会保留用户访问过的每个版本。对于设置为本地运行的应用程序,会保留当前版本和以前的版本。 所以,把 ClickOnce 应用程序回退到以前的版本是一个非常简单的过程。如果用户进入“添加/删除程序”控制面板选项,所显示的对话框将允许删除 ClickOnce 应用程序或回退到以前的版本。管理员可以修改清单文件,使之指向以前的版本。之后,下次用户启动应用程序时,会检查是否更新版本。应用程序不是查找要部署的新程序集,而是恢复以前的版本,但不需要用户的干涉。这也是ClickOnce部署的一个优势。
2、ClickOnce可定制的内容还是简单了点,如果需要更为精致的用户对话界面,还是需要自定义Windows Installer来实现,或通过第三方的InstallShield等专业工具。但它提供了一种界面友好的自我管理机制,几乎实现了真正的无接触部署(No Touch Deployment)。