转载:https://intellitect.com/deploying-app-squirrel/

应用程序部署变得容易

许多.NET开发人员都熟悉ClickOnce,这是微软用于快速打包和部署易于最终用户安装的软件的简单部署解决方案。然而,这些便利也有其局限性。

  • 只有几种自动更新的情况。要在更新可用时显示自定义UI,需要禁用自动更新并处理代码中的所有内容。
  • 生成的安装程序具有固定的部署位置。安装程序必须下载所有应用程序文件。
  • 确保下载则每个应用程序文件的LL。DOI吴先生当可能需要重新尝试时,可能会导致脆弱的互联网连接问题。
  • 不支持机器范围的安装。
  • 支持在线和离线安装都是困难的。
  • 在安装/卸载期间不支持自定义操作。

松鼠提供一个替代方案,提供类似的终端用户安装体验,并使用NuGet打包和部署您的应用程序。它在开发人员控制和自动更新之间提供了一个优雅的平衡。

与项目集成

让我们看看如何部署一个简单的HelloWorld应用程序。

1

2

3

4

5

6

7

8

9

10

11

12

<Window x:Class="HellowWorld.WPF.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        mc:Ignorable="d" Loaded="MainWindow_OnLoaded"

        Title="MainWindow" Height="350" Width="525">

    <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center" TextElement.FontSize="20">

        <TextBlock x:Name="CurrentVersion" Text="Loading..."/>

        <TextBlock x:Name="NewVersion" />

    </StackPanel>

</Window>

首先,安装Sclirel.WindowsNuGet包:

PM> Install-Package Squirrel.Windows

接下来,我们需要添加代码来检查更新。与ClickOnce不同,您的应用程序没有神奇的引导。您必须在代码中进行更新检查。幸运的是,松鼠库只需几行代码就可以做到这一点。

对于这个应用程序,我们将只在窗口加载时执行一次更新检查。

1

2

3

4

5

6

7

8

9

private async void MainWindow_OnLoaded(object sender, RoutedEventArgs e)

{

    using (var updateManager = new UpdateManager(@"C:\SquirrelReleases"))

    {

        CurrentVersion.Text = $"Current version: {updateManager.CurrentlyInstalledVersion()}";

        var releaseEntry = await updateManager.UpdateApp();

        NewVersion.Text = $"Update Version: {releaseEntry?.Version.ToString() ?? "No update"}";

    }

}

UpdateApp方法

在本例中,我在更新的位置使用本地文件夹。在大多数情况下,这个路径可能是一个URL。

方便的UpdateApp方法为我们做了很多工作:

  • 检查任何可用的更新
  • 下载它找到的任何新版本。
  • 应用发行版(因此,下一次应用程序启动时将启动最新版本)。s)

如果您希望对更新过程有更多的控制,UpdateManager还有其他方法可以让您对整个过程有很大的控制。UpdateManager还支持将应用程序重新启动到最新版本。

现在这个应用程序已经编写好了,我们需要发布它。松鼠使用NuGet包来部署您的应用程序,因此我们需要将它捆绑为NuGet包。有关创建NuGet包的详细信息,请参阅博客帖子。对于这个例子,我下载了最新的(v4.1.0)NuGet CLI,并将它放在我的项目文件旁边,并使用PackageManager控制台运行命令。

Nuspec文件

创建一个简单的nuspec文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?xml version="1.0"?>

<package >

  <metadata>

    <id>HelloWorld</id>

    <version>1.0.0</version>

    <authors>Me</authors>

    <owners>Me</owners>

    <description>HelloWorld - Squirrel</description>

    <releaseNotes>Initial release.</releaseNotes>

    <copyright>Copyright ©  2017</copyright>

  </metadata>

  <files>

    <file src="bin\Release\*.*" target="lib\net45\" exclude="*.pdb;*.vshost.*"/>

  </files>

</package>

大多数值的功能与NuGet包完全相同,但是有一些需要注意的事情,因为这是与松鼠一起分发的:

  • 这个ID不得包含空格
  • 身份不应包含任何期间(违反标准Nuget建议).
  • 当在“控制面板”中的已安装程序列表中查看时,说明将显示为程序名称。
  • 将应用程序及其所有依赖项放在NuGet包中的lib\net 45文件夹中(无论您的应用程序是否是.NET 4.5应用程序,这都只是松鼠使用的文件夹)。
  • 确认NuGet包不包含任何依赖项或目标多个平台。

创建NuGet包

若要创建NuGet包,请运行:

.\nuget pack nuget\HelloWorld.nuspec

这将在我们的项目目录中生成一个NuGet包“HelloWorld d.1.0.0.nupkg”。

最后,我们需要通过松鼠运行NuGet包来创建一个发行版。

Squirrel --releasify HelloWorld.1.0.0.nupkg --releaseDir "C:\SquirrelReleases"

注意:如果此过程失败,您可能需要重新启动VisualStudio以获得PackageManager控制台来重新加载这些工具。

输出目录现在包含四个文件:

Setup.exe包含NuGet包的完整副本。因此,分发这一个文件就足够安装应用程序了。文件的名称不重要,并且你可以把它重命名为你喜欢的任何东西。

“发布”文件包含要安装的版本列表。这只是一个简单的文本文件,包含所有包的SHA 1哈希、文件名和文件大小。

77A4810CCFFF6772E21E4C499C696D909A9CE932 HelloWorld-1.0.0-full.nupkg 1165627

T初始安装d不实际使用t他是HelloWorld.1.0.0.nupkg文件。但是,它是执行更新所必需的。

还有一个Setup.msi被创建为做机器宽安装。它可以被忽略(或残废如果这不是你需要支持的东西的话。

运行Setup.exe文件允许安装和启动应用程序。

更新仿真

现在让我们模拟一个更新,看看松鼠在工作

  • 将nuspec文件中的版本号更新为1.0.1
  • .\Nuget Pack Nuget\HelloWorld.nuspec生成新的NuGet包
  • 通过运行松鼠-Relasify HelloWorld.1.0.1.nupkg-RelaseDir“C:\S情Releases”

输出目录现在包含一些额外的文件。

Setup.exe更新为包含最新的完整NuGet包。任何运行它的人都将获得应用程序的最新版本(在本例中为1.0.1)。如果您需要保留旧的Setup.exe文件以快速安装旧版本,请确保在运行松鼠Relasify命令之前重新命名现有的Setup.exe文件。

版本文件已被更新,以包含新包的其他条目。

77A4810CCFFF6772E21E4C499C696D909A9CE932 HelloWorld-1.0.0-full.nupkg 1165627

8759B8C13E089CBE1A28EA3D6B0886B84D5B52C9 HelloWorld-1.0.1-delta.nupkg 9234

9360C6F390BB38C5FDCC2FF2A3A9EA56919867F8 HelloWorld-1.0.1-full.nupkg 1165626

您将注意到,除了HelloWorld.1.0.1-ful.nupkg之外,还创建了HelloWorld-1.0.1-delta.nupkg包。它不是包含完整的应用程序,而是只包含二进制文件之间的增量。它们通常要小得多,而且部署速度更快。您可以控制应用程序想要使用增量更新还是只使用完全更新(文献资料)通过使用UpdateManager。

这个UpdateApp我们在这个应用程序中使用的扩展方法总是下载完整的更新版本。

重新运行应用程序验证是否已应用了更新。

再重新启动应用程序一次,显示我们正在运行最新版本。

松鼠精华

松鼠也有很多小功能(许多是为了缓解ClickOnce上的痛点)。您可以阅读完整文件但这里有一些亮点。

  • “飞溅屏幕”,如果安装程序花费太多的时间。如果应用程序安装得足够快,它就不会显示出来;这证明了松鼠的速度有多快(博士).
  • 简单的GitHub集成,可以轻松地从GitHub部署应用程序(博士).
  • 运行由安装程序事件触发的代码的能力(博士).

“松鼠:这就像ClickOnce,但工作™“是本申请的适当口号。将松鼠集成到Windows桌面应用程序中只需要很短的时间。

用松鼠顺利地部署您的应用程序相关推荐

  1. 在Tomcat中部署Java Web应用程序几种方式

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录.  一.静态部署       静态部署指的是我们在服务器启动之 ...

  2. 开发笔记13 | 部署 Node.js 应用程序到云 ECS

    <<系列文章集 前言 在之前的一篇文章中,我们介绍了 如何将一个本地的 Java 应用程序直接部署到阿里云 ECS ,有不少读者反馈,在本文中,我们来介绍如何部署 Node.js 应用程序 ...

  3. SpringBoot之二:部署Spring Boot应用程序方式

    衡量多种部署方式 Spring Boot应用程序有多种构建和运行方式,其中一些你已经使用过了. 在IDE中运行应用程序(涉及Spring ToolSuite或IntelliJ IDEA). 使用Mav ...

  4. win7下安装IIS7.0及部署VS2010 ASP.NET程序网站的相关问题

    win7下安装IIS7.0及部署VS2010 ASP.NET程序网站的相关问题  配置环境 操作系统:microsoft  windows 7 服务平台:.net4.0 开发工具:microsoft  ...

  5. 在Windows Server 2012 R2 Standard 部署 ASP.NET Core程序

    前言: 随着ASP.NET Core 1.0的发布,论坛里相关的文章也越来越多,正好有时间在测试环境上搭建 ASP.NET Core的发布环境,把过程中遇到的问题写给大家,以便有用到的朋友需要. 环境 ...

  6. aws 删除ec2实例_如何在AWS EC2实例上部署Spring Boot应用程序

    aws 删除ec2实例 你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialise ...

  7. 如何在AWS EC2实例上部署Spring Boot应用程序

    你好朋友, 在本教程中,我们将看到如何在AWS EC2实例上部署Spring Boot应用程序. 这是我们将要执行的步骤. 1.使用Spring Boot Initialiser创建一个Spring ...

  8. 在Amazon Elastic Beanstalk上部署Spring Boot应用程序

    在此博客中,我们将看到如何在Amazon ElasticBeanstalk上部署Spring Boot应用程序. Amazon ElasticBeanstalk具有一个预配置的Java环境,可用于部署 ...

  9. openshift 部署_OpenShift Express:部署Java EE应用程序(支持AS7)

    openshift 部署 在过去的几年中,我越来越多地听说过"云"服务. 最初,我并不是很想尝试一下. 但是几个月后(一年?),我决定看看这是怎么回事. 我从事Java EE开发已 ...

最新文章

  1. 启动springboot报错Error creating bean with name 'dataSource' defined in class path resource
  2. go语言中将函数作为变量传递
  3. 有关SQL server connection Keep Alive 的FAQ(2)
  4. 开源调度框架xxl-job集成SpringBatch详解
  5. Android之XUtils的框架总结
  6. 远控免杀专题(18)-ASWCrypter免杀
  7. php nodelist,了解NodeList、HTMLCollection以及NamedNodeMap的使用(代码)
  8. 张会生 现代通信系统原理_通信原理实验——软件仿真实验三 模拟通信系统—SSB...
  9. RadHat 6 系列心路历程、新功能及变化
  10. 华三 h3c DHCP
  11. iOS-PingFangSC字体
  12. php网站友链直显代码,discuz 友情链接 代码
  13. 用c语言莲花,用荷花为寓意的网名-网名搜索
  14. Adobe illustrator(AI) 矢量图形软件 | 图像描摹(怎么把白色背景色的图片背景变为透明色)
  15. WBS-Work Breakdown Structure工作分解结构
  16. 通过EverEdit工具连接Linux系统远程操作文件
  17. RED LION 1GS00000
  18. 新手如何运营好阿里国际站+产品标题组成
  19. 【hash】兔子与兔子(C++)
  20. 9.7-一定要开始学了

热门文章

  1. 全球与中国制药工艺用隔膜阀市场现状及未来发展趋势
  2. 先学python还是ros_如何学习Ros?
  3. oracle 创建 temporary tablespace
  4. 联发科AioT平台处理器i300介绍
  5. 重磅 | 吴恩达Coursera新课已经上线,开启全民 AI 时代!
  6. 8.0强行转换后变成了7_干货|从中式英语,到雅思听力8.0,外研社英语演讲省一,非英专的她做了这些...
  7. python api调用百度ai平台_百度ai开放平台使用方法(附带详细案例步骤)
  8. Android基本常识、技术
  9. 张一鸣:如何深度思考
  10. 基于asp.net318洗车行服务会员管理系统