Skip to main content

release_updater 1.3.2 copy "release_updater: ^1.3.2" to clipboard
release_updater: ^1.3.2 copied to clipboard

A simple way to automatically update release/installation files in a local directory.

release_updater #

pub package Null Safety Codecov Dart CI GitHub Tag New Commits Last Commits Pull Requests Code size License

This package brings a simple way to automatically update release/installation files in a local directory.

It also comes with built-in CLI tools to easily generate a release bundle (Zip file) or serve release files for multiple platforms.

Motivation #

Since Dart can run in many native platforms (Linux/x64, macOS/x64/arm64, Windows/x86), it's not simple to manage all the different releases+platforms files that a compiled Dart application can have.

In the same way that modern Browsers, and many other applications, can have automatic builds and updates for multiple platforms, this package provides tools and an API to easily achieve that.

API Documentation #

See the API Documentation for a full list of functions, classes and extension.

Usage #

import 'dart:io';

import 'package:release_updater/release_updater_io.dart';

void main() async {
  var storage = ReleaseStorageDirectory('appx', Directory('/install/path'));
  
  var provider = ReleaseProviderHttp.baseURL('https://your.domain/appx/releases');

  var releaseUpdater = ReleaseUpdater(storage, provider);

  var version = await releaseUpdater.update();

  print('»  Updated to version: $version');

  var runResult = await releaseUpdater.runReleaseProcess('run.exe', ['-a']);

  var exitCode = runResult!.exitCode;
  
  print('»  Exit code: $exitCode');
  print('»  Result: ${runResult.stdout}');

  exit(exitCode);
}

ReleaseProvider #

You can implement your own ReleaseProvider or use just the built-in ReleaseProviderHttp class.

CLI Tools #

  • release_updater: A CLI updater.

  • release_updater_server: A simple HTTP server to provide releases using the shelf package.

release_updater #

The release_updater is a CLI for the ReleaseUpdater class.

To build a release:

$> release_packer release_packer.json build ./source-dir ./releases-dir -Pupload-url=http://your-server:8090/ -Pupload-user=userx -Pupload-pass=pass123
  • The -P arguments are properties to the JSON configuration file (see %UPLOAD_URL% below).

Example of a release_packer.json file:

{
  "name": "appx",
  "version_from": "pubspec.yaml",
  "prepare": [
    "dart_pub_get",
    {"dart_compile_exe": "bin/foo.dart"},
    {"windows_gui": "bin/foo.exe"}
  ],
  "finalize": [
    {"rm": "bin/foo.exe"},
    {
      "upload_release": {
        "url": "%UPLOAD_URL%",
        "authorization": {
          "user": "%UPLOAD_USER%",
          "pass": "%UPLOAD_PASS%"
        }
      }
    }
  ],
  "files": [
    "README.md",
    {"hello.txt": "hello-world.txt"},
    {"bin/foo.exe": "."},
    {"libfoo-arm64.dylib": ".", "platform":  "^macos-arm64$"},
    {"libfoo-x64.dylib": ".", "platform":  "^macos-x64$"},
    {"libfoo.so": ".", "platform":  "^linux.*$"},
    {"libfoo.dll": ".", "platform":  "^windows.*$"}
  ]
}

JSON Format:

  • name: the application name, for the Release name.

  • version: the version of the Release.

  • version_from: the JSON or YAML file to provide the field version (if the parameter field is not provided).

  • platform: is a RegExp string to match the building platform. See the ReleasePlatform class.

  • Command types:

    • dart_pub_get: performs a dart pub get.
    • dart_compile_exe: performs a dart compile exe %dart_script.
      • NOT supported when a dependency has build hooks (native assets, like sqlite3 3) at runtime: use dart_build_cli. The build is aborted before the prepare commands when the package resolution is up to date, and again after them. Dev dependencies with build hooks don't count.
    • dart_build_cli: performs a dart build cli, building a bundle at %output/bundle/ with bin/%name (bin/%name.exe on Windows) and lib/ (the dynamic libraries of the build hooks).
      • The value is the Dart script ("bin/foo.dart") or a Map:
        • target: the Dart script.
        • output: the output directory, inside the root directory. Default: build/cli/%name.
        • args: extra dart build cli arguments (String or List), like --target-os. Not the target or the output: use target/output.
        • launcher: if true, writes a script at the bundle root (%name, or %name.cmd on Windows) that runs bin/%name. It works through symbolic links to it (like one in /usr/local/bin).
      • The executable loads the dynamic libraries from ../lib/, relative to itself: keep the bin/ and lib/ layout in the release.
    • dart_build_%subcommand: performs a dart build %subcommand %args, with the arguments as is (String or List).
    • dart: performs a dart %command.
    • windows_gui: Changes an executable Windows Subsistem to GUI.
    • command: performs a shell %command.
    • rm: Deletes a file.
    • upload_release: uploads the generated release.
      • url: release server base URL.
      • authorization: HTTP basic authorization.
        • username: authentication username.
        • password: authentication password.
  • Command errors:

    • A command that fails aborts the build: the error is logged, the remaining commands are NOT executed, and the release_packer CLI exits with code 1. This avoids a silent error generating and releasing an incomplete package/artifact.
    • Some commands are just ignored (skipped) when not applicable, and do NOT abort the build:
      • rm of a file that doesn't exist.
      • windows_gui over a file that is not a Windows executable (the usual case when building on another platform).
  • files: each entry of files can be:

    • A String with a file path:
      "file/path.txt"
      
    • A Map with extra parameters:
      • A file with a renamed path and a specific platform.
        {"source/file/path.txt": "release/file/path", "platform": "^regexp"}
        
      • A file without rename it:
        {"source/file/path.txt": "."}
        
      • A directory tree:
        {"lib/resources/": "packages/pack_name/resources/"}
        
      • A directory tree at the release root (/):
        {"build/web/": "/"}
        
      • A file from a dart_compile_exe command:
        {"bin/client.exe": "client.exe", "dart_compile_exe": "bin/client.dart"}
        
      • The bundle of a dart_build_cli command, at the release root (bin/client, lib/... and the client launcher):
        {"dart_build_cli": {"target": "bin/client.dart", "launcher": true}}
        
        Or with an explicit mapping:
        {"build/cli/client/bundle/": "/", "dart_build_cli": "bin/client.dart"}
        
        Files with the same release path (like the lib/ of two bundles) are merged if identical; different contents abort the build.
      • A Windows executable file with the Windows Subsistem set to GUI:
        {"bin/client.exe": "client.exe", "windows_gui": true}
        

release_updater_server #

To serve a release directory:

$> release_updater_server releases-server-config.json

Config file:

{
  "releases-directory": "/path/to/releases",
  "port": 8090,
  "address": "0.0.0.0",
  "upload-user": "userx",
  "upload-pass": "123456"
}
  • If the properties upload-user and upload-pass (with length >= 6) are defined, upload of files will be allowed.
    • All files are saved in the releases-directory without any sub-directory.
    • Upload errors can block an IP for 30min.
  • A high volume of requests can block an IP for 2min.

Source #

The official source code is hosted @ GitHub:

Features and bugs #

Please file feature requests and bugs at the issue tracker.

Contribution #

Any help from the open-source community is always welcome and needed:

  • Found an issue?
    • Please fill a bug report with details.
  • Wish a feature?
    • Open a feature request with use cases.
  • Are you using and liking the project?
    • Promote the project: create an article, do a post or make a donation.
  • Are you a developer?
    • Fix a bug and send a pull request.
    • Implement a new feature, like other training algorithms and activation functions.
    • Improve the Unit Tests.
  • Have you already helped in any way?
    • Many thanks from me, the contributors and everybody that uses this project!

If you donate 1 hour of your time, you can contribute a lot, because others will do the same, just be part and start with your 1 hour.

Author #

Graciliano M. Passos: gmpassos@GitHub.

License #

Apache License - Version 2.0

34
likes
160
points
4.51k
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A simple way to automatically update release/installation files in a local directory.

Repository (GitHub)
View/report issues

License

Apache-2.0 (license)

Dependencies

archive, ascii_art_tree, base_codecs, collection, crypto, data_serializer, gcloud, googleapis_auth, mercury_client, path, pub_semver, shelf, shelf_gzip, shelf_static, yaml

More

Packages that depend on release_updater