18

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

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

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

4

2 回答 2

18

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

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

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

最大的优点是构建与使用 Visual Studio 或使用 msbuild 的自动构建相同(除了几个完全可选的附加属性)。在构建中添加额外的环境所需要做的就是在项目文件中创建新的构建配置和相应的慢 cheetah 转换和属性组。

整个设置至少适用于 .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>
于 2014-06-17T07:29:05.687 回答
3

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

其次,要进行不同的构建,可以在项目下设置四个文件夹,每个文件夹一个名称。然后设置四个构建配置(称它们相同)。然后设置一个将文件复制到 \bin 文件夹的构建后命令。如果您设置文件夹名称以在其中包含构建配置,它将复制该配置中的任何一个。

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

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

于 2013-02-25T07:43:10.417 回答