65.9K
CodeProject 正在变化。 阅读更多。
Home

为应用程序的不同生命周期终结点重用单个 ClickOnce 生成

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018年12月31日

CPOL

8分钟阅读

viewsIcon

9725

downloadIcon

178

本文提供了一个示例,说明如何更改现有 ClickOnce 发布中的应用程序配置设置、更新清单文件,然后使用 Mage 实用程序使用现有证书文件更新清单。

引言

ClickOnce 在开发客户安装时是一个非常灵活的工具。我遇到的一个挑战是拥有一组可以进行源代码控制的发布清单文件,但您希望重用该清单将其部署到各种应用程序生命周期环境,例如测试、质量保证和最终的生产环境。这将是一个很好的例子,其中不存在构建服务器和/或应用程序的开发非常线性。在每个环境(例如测试、质量保证、生产)中,特定的应用程序设置可能因该环境而异。在为本文创建的附加命令行项目中,我演示了如何更新单个 ClickOnce 发布文件集中的清单文件和 setup EXE 文件,以使其在不同的环境端点(即测试、质量保证、生产环境)中工作。

背景

众所周知,IIS 服务可以容纳多个 IP(NIC)以及每个 IP 的多个端口。这是为应用程序的单个 ClickOnce 发布提供应用程序的测试/质量保证/生产环境的一种方法。但是,如果资源有限且成本是一个因素,则可以通过动态更新 ClickOnce 发布文件来使用一个 IP 和一个端口。通过这种方式,您还可以使用所有必要的依赖项对这些文件进行源代码控制,但能够更新哈希和 setup EXE 以指向确认新的发布位置。本文提供了一个如何完成此任务的示例。

完成本文使我对 ClickOnce 发布的工作原理有了更多的经验和理解。它也让我意识到开发 ClickOnce 部署的其他可能性,包括覆盖一些功能。

Using the Code

附加的示例代码使用在 Visual Studio 2015 中构建的命令项目,也可以在 GitHub 上找到(https://github.com/randykroeger/SandBox)。使用命令项目提供了一种很好的方式来演示此 PowerShell 代码如何更新应用程序的发布清单文件,从而将部署指向不同的端点。该解决方案包含一个 readme 文件,其中提供了有关设置 IIS 的帮助以及我在构建此示例项目时遇到的一些故障排除提示。

项目

本节解释了附加的项目。建议您在阅读本文时下载项目并参考它。考虑到该项目,我决定不在本文中包含项目中的代码示例。在阅读文章时查看代码似乎更容易。

项目要点

  1. 这个示例项目是一个简单的命令项目。我添加了一个公共引用,以提供一个示例,说明在更新 ClickOnce 清单时如何处理引用。
  2. 项目结构向项目添加了一个部署文件夹。我添加了一个部署文件夹,以便应用程序的更改可以与所有适当的二进制引用一起进行源代码控制,并且执行部署的人可以轻松找到部署。在使用构建服务器的情况下,这将以不同的方式配置。您很少会对发布的进行源代码控制。
  3. 在部署文件夹下,我创建了一个“发布”文件夹,在该文件夹中,创建了一个“bin”文件夹。“bin”文件夹用作应用程序的发布位置。当需要发布新的 ClickOnce 部署时,新的二进制文件和清单文件将发布到“bin”文件夹(即,右键单击项目 -> 发布)。
  4. 项目发布设置:由于应用程序发布文件是在“bin”文件夹中创建的,这使得“发布”文件夹可以用于与其他发布文件不直接相关的其他依赖项。这将是构建事件的一个很好的用途。
    设置发布参数(分步)
    1. 右键单击项目,然后选择“发布”(注意:您也可以通过项目属性访问发布)。
    2. 您会注意到发布位置设置为相对路径“.\Deployment\Publish\bin\”。
    3. 单击“下一步”。
    4. 对于网站,您会注意到路径是:“http://dell-dev64/Test/”。您需要将该值更改为您的应用程序端点。这将是您用于更新“$deploymentUrlFormat”变量的相同端点。这将在下面“兴趣点”中回顾 PowerShell 逻辑时进一步解释。在大多数情况下,如果您不更改项目发布属性中的此值,这真的不重要。只要您在 PowerShell 脚本中将“$deploymentUrlFormat”变量更新为您的端点,这就是最重要的。您可以让 PowerShell 脚本读取项目属性以获取该端点。这样,开发人员可以轻松更改它并且无缝。您的部署还有另外两个选项,本文不涉及这些选项。
    5. 单击“下一步”。
    6. 我将应用程序仅在线提供。对于此示例,您选择哪个都无关紧要。
    7. 单击下一步或完成。将创建一组新的发布文件。
  5. Mage 实用程序用于完成对清单部署文件的修改。请务必查看此实用程序。您将看到此项目的 PowerShell 可以通过不同的方式修改以实现相同的结果(https://docs.microsoft.com/en-us/dotnet/framework/tools/mage-exe-manifest-generation-and-editing-tool)。
  6. Execute.ps1。此文件位于部署文件夹中。此部署文件夹可以复制到任何服务器并执行,以更新应用程序的 ClickOnce 发布(即此控制台应用程序)。此 PowerShell 脚本的顶部包含所有支持函数。我用注释 - “Region”和“EndRegion”将这些函数括起来。此部分下方是脚本的入口点。

关注点

本文的重点是附加项目中名为 Execute.ps1 的 PowerShell 脚本。这就是奇迹发生的地方。

在开始测试之前,您需要打开 Execute.ps1 脚本,并用您的每个环境的虚拟目录(虚拟路径)所在的端点更新硬编码变量“$deploymentUrlFormat”,如上面的发布设置所述。请注意,“$deploymentUrlFormat”是一个格式字符串,带有 0 索引。该索引是从 PowerShell 提示符中选择的环境。当您回顾脚本中的步骤时,这将变得清晰。

要更新的 PowerShell 脚本行:$deploymentUrlFormat = "http://dell-dev64/Test/{0}"

脚本回顾:为了方便参考,我还将 Execute.ps1 PowerShell 脚本中的注释标记为下面的描述。

  1. 查询此发布脚本将为哪个环境更新和部署。此值用于第二步。
  2. 使用“$deploymentUrlFormat”和“第一步”中输入的环境值设置“$deploymentUrl”变量。
    注意:确保您已相应地设置虚拟目录。在此示例中,我们使用测试、质量保证、生产。因此,例如,在本地,我将设置 http://dell-dev64/Test/Testhttp://dell-dev64/Test/QAhttp://dell-dev64/Test/Prod,其中 http://dell-dev64/Test 设置为应用程序,测试、质量保证、生产是虚拟目录。
  3. 查询与上述端点相关的物理路径。
  4. 如果存在,则删除以前发布的清单文件,并从部署路径复制。注意:部署路径将是部署文件夹(如上面项目中所示)在 IIS 服务器本地复制的任何位置。在本地复制部署文件夹可以消除任何网络复制或安全用户安全限制。
  5. 描述更新 ClickOnce 清单和设置以指向新端点
    1. 变量设置。为了快速演示,我硬编码了预期清单文件的名称。请注意,“App.Config.{0}”是一个格式字符串。索引 0 用于测试、质量保证、生产。在部署文件夹中,您将看到预定义的三​​个文件。它们将在接下来的步骤中用于复制和重命名。
    2. 创建文件指针。在这里,我们创建了将要更新的所有清单的完整所需路径。您会注意到变量“$destBinaryLocation”。我正在从“$applicationFilePaths”中找到的路径集合中获取顶部值。最初,我允许每次发布将文件夹名称更新为新版本。如果我想将更改提交到源代码控制,这会变得有问题。所以我将文件夹名称保持为版本 1.0.0.0。这样,源代码控制可以跟踪更改。如果以后我更改了解析发布路径的方法,那么我们获取“$applicationFilePaths”集合中顶部路径的逻辑仍然应该有效。这将取决于您的实现。
    3. 验证步骤。与任何应用程序一样,脚本应遵循验证从用户输入构建的所有变量的相同原则。
    4. 此时,我们已准备好进行更新。第一项是更改由应用程序发布创建的 setup.exe 中的端点。此 setup 可执行文件是由项目创建的可下载安装程序,用于与清单文件一起发布。此可执行文件带有参数,您可以在其中更改最初在发布中添加的内容。
    5. 在此步骤中,正在更新清单文件的哈希条目。此更新的目的是由于端点更改和任何其他设置更改而对配置文件所做的更改。我已将用于更新清单条目的代码封装在一个函数中。我还复制了部署文件,删除了“.deploy”。我发现当我这样做时,我没有看到 MSB3113 错误。这似乎满足了 Mage 实用程序的执行。
    6. 清理临时文件(即不带 .deploy 扩展名的文件)。
    7. 使用应用程序清单文件的哈希值更新部署清单。由于应用程序清单文件已更改,因此这是必要的。
    8. 使用 Mage 实用程序更新部署清单上的证书。
    9. 将部署清单复制回二进制位置以更新该副本。

这基本上就是此示例需要完成的所有内容。一旦掌握了基础知识,您就可以构建其他类似的部署。我还提供了一些帮助我更好地理解这些基础知识的链接。

其他相关文章

历史

  • 2018年12月31日:初始版本
© . All rights reserved.