Clickonce部署到多个环境

时间:2013-02-08 14:53:08

标签: deployment clickonce

我有一个WPF应用程序,我想通过ClickOnce部署给我们的用户。我们有四个环境,系统测试,用户测试,并行生产和生产。每个都需要一个不同的配置文件,其中包含服务器名称和特定于环境的其他内容,因此它们不能全部使用相同的代码库。大多数代码是相同的,但由于不同的.config文件,最终的包将略有不同。

我发现我们在用户测试中安装了一个版本,比如版本05,然后他们进行测试,然后在给他们下一个版本的时候,我们应该能够安装一个更新的包用户测试Web服务器,然后他们可以通过单击部署URL更新其版本。但是当他们这样做时,它说“具有相同身份的应用程序已经存在”,我们必须通过控制面板卸载才能安装版本06。这似乎是错误的,而不是clickonce。

您如何建议我将此应用程序构建和部署到四个不同的环境中,以便在每个环境中我们都能够在服务器上放置新版本,并且用户在该环境中进行测试或使用它只需要下拉更新,不需要卸载任何东西?

2 个答案:

答案 0 :(得分:14)

我一直在寻找解决方案一段时间,让我感到震惊的是,我想出的最后一个实际上就像这样简单:

  • Slow Cheetah用于根据所选的构建配置转换配置文件(例如,调试/发布)
  • 每个构建配置的属性组,其中包含项目文件中特定的一次性项目属性(例如,ProductName和AssemblyName(用于并行安装test和prod版本),InstallUrl)。
  • 执行/ target时,通过msbuild指定其他属性(如ApplicationVersion,MinimumRequiredVersion):发布

没有必要手动复制任何配置文件,因为慢速猎豹会处理这个问题。将在相应的构建配置的输出文件夹中创建单击一次包(例如bin / Debug或您拥有的任何内容)。

最大的优点是使用Visual Studio或使用msbuild进行自动构建时的构建是相同的(除了少数几个完全可选的附加属性)。要为构建添加其他环境,您只需要在项目文件中创建新的构建配置和相应的慢速猎豹变换以及属性组。

整个设置至少使用.NET 3.5(不能说早期版本)和更高版本。

也许这有助于任何人。随意询问详情。

PS:属性组看起来像这样(将它们放在定义默认ClickOnce设置的第一个属性组之后):

  <PropertyGroup Condition=" '$(Configuration)' == 'Demo' ">
    <AssemblyName>Com.MyApplication.Main.Demo</AssemblyName>
    <InstallUrl>http://demoserver/myapp/</InstallUrl>
    <ProductName>My Application %28Demo%29</ProductName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Test' ">
    <AssemblyName>Com.MyApplication.Main.Test</AssemblyName>
    <InstallUrl>http://testserver/myapp/</InstallUrl>
    <ProductName>My Application %28Test%29</ProductName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Prod' ">
    <AssemblyName>Com.MyApplication.Main</AssemblyName>
    <InstallUrl>http://prodserver/myapp/</InstallUrl>
    <ProductName>My Application</ProductName>
  </PropertyGroup>

答案 1 :(得分:2)

首先,您无法从两个不同的URL安装具有相同部署名称的应用程序,而无需先卸载一个。 ClickOnce将此用于安全性,以确保有人不会试图劫持您的部署。

其次,要进行不同的构建,您可以在项目下设置四个文件夹,每个文件夹都有一个名称。然后设置四个构建配置(称它们为同一个东西)。然后设置一个post-build命令,将文件复制到\ bin文件夹中。如果您设置文件夹名称以在其中包含构建配置,则它将复制随该配置一起使用的那些。

COPY/Y "$(TargetDir)myfile_$(ConfigurationName)\*.*" "$(TargetDir)"

第三,您必须将文件包含在项目本身中,以便将它们标记为包含在部署中,即使您在构建完成后使用复制命令替换它们也是如此。并且必须包括四个目录,即使最终它们没有被使用。