All Projects → Tyrrrz → Onova

Tyrrrz / Onova

Licence: other
Unopinionated auto-update framework for desktop applications

Projects that are alternatives of or similar to Onova

Pyupdater
Pyinstaller auto-update library
Stars: ✭ 300 (+7.14%)
Mutual labels:  update, auto
Update4j
Create your own auto-update framework
Stars: ✭ 497 (+77.5%)
Mutual labels:  update, auto
Freeiptv
FreeIPTV • Watch Free IPTV World Wide
Stars: ✭ 68 (-75.71%)
Mutual labels:  update, auto
autumn
采用Spring、Spring Boot、Redis、MyBatis、Shiro、Druid框架开发,搭载mysql数据。 如果你厌烦了MyBatis中需要手动创建表的事情,这个项目非常适合你,自动为你生成表。 从此你不在需要导入sql文件了,项目初始化变得异常简单,结构清晰,易于开发,真正拿来可用。 全注解MyBatis开发,没有任何mapper文件,一切sql 映射都用代码实现,全程无xml配置,对xml编写mapper有恐惧症的人的福音。 提供双向生成功能: 实体类自动生成数据库表,全过程不需要任何SQL语句,所有表自动生成 通过表生成基础结构代码,生成代码中已包含CRUD功能,表级别的API接口全部都有 基本实例数据全自动通过代码初始化,无需干预 仅仅只需要修改数据库连接地址,…
Stars: ✭ 28 (-90%)
Mutual labels:  auto
analysis-net
Static analysis framework for .NET programs.
Stars: ✭ 19 (-93.21%)
Mutual labels:  net-framework
BM
The Utility to Install Songs, Install Mods, Install/Update BMBF, Install HitSounds, download automatically made Playlists, get better support, switch between the modded and unmodded Version of Beat Saber, do full Backups and way more
Stars: ✭ 33 (-88.21%)
Mutual labels:  update
Appimageupdate
AppImageUpdate lets you update AppImages in a decentral way using information embedded in the AppImage itself.
Stars: ✭ 261 (-6.79%)
Mutual labels:  update
NJUPT-auto-evaluate
🐶 南邮本科生学生评教活动的一键自动评价脚本 #南邮# #一键# #教师# #测评# #评价# #脚本# #正方教务管理系统#
Stars: ✭ 24 (-91.43%)
Mutual labels:  auto
PttAutoPush
PTT自動推文 推文機器人(Python)
Stars: ✭ 15 (-94.64%)
Mutual labels:  auto
mongoose-auto-increment-reworked
An auto-incrementing field generator for Mongoose 4 & 5
Stars: ✭ 17 (-93.93%)
Mutual labels:  auto
ForzaHorizonFix
A simple fix for Forza Horizon 4 and Forza Horizon 5 crashes
Stars: ✭ 20 (-92.86%)
Mutual labels:  auto
laravel-magiclink
Create link for authenticate in Laravel without password or get private content
Stars: ✭ 135 (-51.79%)
Mutual labels:  auto
Xam.Plugin.AutoUpdate
Xamarin Forms plugin that auto updates your Android or UWP sideloaded application.
Stars: ✭ 22 (-92.14%)
Mutual labels:  update
pf4j-update
Update mechanism for PF4J
Stars: ✭ 56 (-80%)
Mutual labels:  update
vue-smooth-height
Transition an elements height in response to data changes
Stars: ✭ 40 (-85.71%)
Mutual labels:  auto
Dingbot
基于python标准库,为钉钉群机器人打造的轻量级SDK
Stars: ✭ 23 (-91.79%)
Mutual labels:  auto
amazon-workmail-lambda-templates
Serverless applications for Amazon WorkMail.
Stars: ✭ 17 (-93.93%)
Mutual labels:  update
gitea-auto-update
A script which can update gitea via crontab automatically to a new version.
Stars: ✭ 25 (-91.07%)
Mutual labels:  update
WWDC
🌈 𝐖𝐖𝐃𝐂 𝐒𝐞𝐬𝐬𝐢𝐨𝐧 𝐍𝐨𝐭𝐞𝐬 👩🏻‍💻 ✨
Stars: ✭ 31 (-88.93%)
Mutual labels:  auto
auto-fill-edit-text
This custom EditText can suggest and fill text defined before.
Stars: ✭ 26 (-90.71%)
Mutual labels:  auto

Onova

Build Coverage Version Downloads Donate

⚠️ Project status: maintenance mode (bug fixes only).

Onova is a lightweight auto-update framework for desktop applications. It was primarily designed for updating portable applications that are distributed using archive files, but can be extended for other use cases. Downloaded updates are installed using an embedded external executable, by overwriting files when the application exits. The library requires minimal configuration, doesn't impose any changes to the CI/CD process, and doesn't affect the application's life cycle.

Download

  • NuGet: dotnet add package Onova

Features

  • Requires minimal configuration
  • Supports the following package resolvers:
    • LocalPackageResolver - file system
    • GithubPackageResolver - GitHub releases
    • WebPackageResolver - web version manifest
    • NugetPackageResolver - NuGet feed
    • AggregatePackageResolver - aggregates multiple resolvers
  • Supports the following package extractors:
    • ZipPackageExtractor - zip archives
    • NugetPackageExtractor - NuGet packages
  • Extendable with custom resolvers and extractors
  • Can report progress and supports cancellation
  • Allows updating to any available version, not necessarily latest
  • Overwrites files in-place using an external executable
  • Works with multiple running instances of an application
  • Automatically prompts for elevated privileges if necessary
  • Fully self-contained and doesn't require additional files
  • Supports desktop apps built with .NET Core 3.0+
  • Targets .NET Framework 4.6.1+ and .NET Standard 2.0+ (Windows only)
  • No external dependencies

Workflow

Package resolving

Packages and their versions are resolved using an implementation of IPackageResolver. Currently there are 5 built-in implementations:

LocalPackageResolver

This implementation looks for files in the specified directory using a predefined pattern. Package versions are extracted from file names, e.g. file named MyProject-v2.1.5.zip corresponds to package version 2.1.5.

GithubPackageResolver

This implementation looks for assets in releases of specified GitHub repository using a predefined pattern. Package versions are extracted from release names, e.g. release named v1.0 corresponds to package version 1.0.

Since .NET assemblies do not support semantic versions, pre-releases are ignored.

WebPackageResolver

This implementation requests a version manifest using the specified URL. The server is expected to respond with a plain-text list of package versions and their URLs, separated by space, one line per package. E.g.:

1.0 https://my.server.com/1.0.zip
2.0 https://my.server.com/2.0.zip

NugetPackageResolver

This implementation resolves packages from the specified NuGet feed.

Since .NET assemblies do not support semantic versions, pre-releases are ignored.

AggregatePackageResolver

This implementation provides aggregation over multiple other IPackageResolver instances. It allows resolving and downloading packages from more than one source.

Package extraction

Downloaded packages are extracted using an implementation of IPackageExtractor. Currently there are 2 built-in implementations:

ZipPackageExtractor

This implementation extracts files from zip-archived packages.

NugetPackageExtractor

This implementation extracts files from NuGet packages, from the specified root directory.

Usage

Basic usage example

The following code checks for updates and installs them if they are available, in a single operation.

// Configure to look for packages in specified directory and treat them as zips
using (var manager = new UpdateManager(
    new LocalPackageResolver("c:\\test\\packages", "*.zip"),
    new ZipPackageExtractor()))
{
    // Check for new version and, if available, perform full update and restart
    await manager.CheckPerformUpdateAsync();
}

Handling intermediate steps manually

To provide users with the most optimal experience, you will probably want to handle intermediate steps manually.

// Check for updates
var result = await manager.CheckForUpdatesAsync();
if (result.CanUpdate)
{
    // Prepare an update by downloading and extracting the package
    // (supports progress reporting and cancellation)
    await manager.PrepareUpdateAsync(result.LastVersion);

    // Launch an executable that will apply the update
    // (can be instructed to restart the application afterwards)
    manager.LaunchUpdater(result.LastVersion);

    // Terminate the running application so that the updater can overwrite files
    Environment.Exit(0);
}

Handling updates with multiple running instances of the application

To prevent conflicts when running multiple instances of the same application, only one instance of UpdateManager (across all processes) is able to prepare updates and launch the updater.

In order to correctly handle cases where multiple instances of the application may try to update at the same time, you need to catch these exceptions:

  • LockFileNotAcquiredException - thrown by PrepareUpdateAsync and LaunchUpdater when this instance of UpdateManager cannot acquire a lock file. This means that another instance currently owns the lock file and is probably performing an update.
  • UpdaterAlreadyLaunchedException - thrown by PrepareUpdateAsync and LaunchUpdater when an updater executable has already been launched, either by this instance of UpdateManager or another instance that has released the lock file.

The updater will wait until all instances of the application have exited before applying an update, regardless of which instance launched it.

Etymology

The name "Onova" comes from Ukrainian word for "update" (noun).

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].