Skip to content

Commit

Permalink
refactor(bundler): specific settings on dedicated structs, update REA…
Browse files Browse the repository at this point in the history
…DME (#1380)
  • Loading branch information
lucasfernog committed Mar 25, 2021
1 parent f72b93b commit 080f639
Show file tree
Hide file tree
Showing 17 changed files with 199 additions and 219 deletions.
6 changes: 6 additions & 0 deletions .changes/bundle-macos-refactor.md
@@ -0,0 +1,6 @@
---
"tauri-bundler": minor
"tauri": minor
---

Rename macOS bundle settings from `osx` to `macOS`.
2 changes: 1 addition & 1 deletion .github/workflows/build-smoke-tests.yml
Expand Up @@ -39,7 +39,7 @@ jobs:
- platform: ubuntu-latest
releaseFolder: target/release/bundle/deb
- platform: macos-latest
releaseFolder: target/release/bundle/osx
releaseFolder: target/release/bundle/macos
- platform: windows-latest
releaseFolder: target/release/bundle/msi

Expand Down
11 changes: 5 additions & 6 deletions cli/core/config_definition.rs
Expand Up @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
use serde_json::Value as JsonValue;
use serde_with::skip_serializing_none;

use std::{collections::HashMap, path::PathBuf};
use std::collections::HashMap;

#[derive(Debug, PartialEq, Clone, Deserialize, Serialize, JsonSchema)]
#[serde(untagged)]
Expand All @@ -26,7 +26,7 @@ pub struct DebConfig {
#[skip_serializing_none]
#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct OsxConfig {
pub struct MacConfig {
pub frameworks: Option<Vec<String>>,
pub minimum_system_version: Option<String>,
pub exception_domain: Option<String>,
Expand All @@ -51,7 +51,7 @@ pub struct PackageConfig {
pub struct BundleConfig {
/// Whether we should build your app with tauri-bundler or plain `cargo build`
pub active: bool,
/// The bundle targets, currently supports ["deb", "osx", "msi", "appimage", "dmg"] or "all"
/// The bundle targets, currently supports ["deb", "app", "msi", "appimage", "dmg"] or "all"
pub targets: Option<BundleTarget>,
/// The app's identifier
pub identifier: Option<String>,
Expand All @@ -65,11 +65,10 @@ pub struct BundleConfig {
pub category: Option<String>,
pub short_description: Option<String>,
pub long_description: Option<String>,
pub script: Option<PathBuf>,
#[serde(default)]
pub deb: DebConfig,
#[serde(default)]
pub osx: OsxConfig,
#[serde(rename = "macOS", default)]
pub macos: MacConfig,
pub external_bin: Option<Vec<String>>,
}

Expand Down
38 changes: 16 additions & 22 deletions cli/core/schema.json
Expand Up @@ -84,7 +84,7 @@
"deb": {
"useBootstrapper": false
},
"osx": {
"macOS": {
"useBootstrapper": false
}
},
Expand Down Expand Up @@ -296,13 +296,13 @@
"null"
]
},
"osx": {
"macOS": {
"default": {
"useBootstrapper": false
},
"allOf": [
{
"$ref": "#/definitions/OsxConfig"
"$ref": "#/definitions/MacConfig"
}
]
},
Expand All @@ -316,20 +316,14 @@
"type": "string"
}
},
"script": {
"type": [
"string",
"null"
]
},
"shortDescription": {
"type": [
"string",
"null"
]
},
"targets": {
"description": "The bundle targets, currently supports [\"deb\", \"osx\", \"msi\", \"appimage\", \"dmg\"] or \"all\"",
"description": "The bundle targets, currently supports [\"deb\", \"app\", \"msi\", \"appimage\", \"dmg\"] or \"all\"",
"anyOf": [
{
"$ref": "#/definitions/BundleTarget"
Expand Down Expand Up @@ -723,17 +717,7 @@
},
"additionalProperties": false
},
"NotificationAllowlistConfig": {
"type": "object",
"properties": {
"all": {
"default": false,
"type": "boolean"
}
},
"additionalProperties": false
},
"OsxConfig": {
"MacConfig": {
"type": "object",
"properties": {
"exceptionDomain": {
Expand Down Expand Up @@ -770,6 +754,16 @@
},
"additionalProperties": false
},
"NotificationAllowlistConfig": {
"type": "object",
"properties": {
"all": {
"default": false,
"type": "boolean"
}
},
"additionalProperties": false
},
"PackageConfig": {
"type": "object",
"properties": {
Expand Down Expand Up @@ -879,7 +873,7 @@
"deb": {
"useBootstrapper": false
},
"osx": {
"macOS": {
"useBootstrapper": false
}
},
Expand Down
23 changes: 14 additions & 9 deletions cli/core/src/build/rust.rs
Expand Up @@ -3,7 +3,9 @@ use std::{fs::File, io::Read, path::PathBuf, process::Command, str::FromStr};
use serde::Deserialize;

use crate::helpers::{app_paths::tauri_dir, config::Config};
use tauri_bundler::{AppCategory, BundleBinary, BundleSettings, PackageSettings};
use tauri_bundler::{
AppCategory, BundleBinary, BundleSettings, DebianSettings, MacOSSettings, PackageSettings,
};

/// The `workspace` section of the app configuration (read from Cargo.toml).
#[derive(Clone, Debug, Deserialize)]
Expand Down Expand Up @@ -317,15 +319,18 @@ fn tauri_config_to_bundle_settings(
},
short_description: config.short_description,
long_description: config.long_description,
script: config.script,
deb_depends: config.deb.depends,
deb_use_bootstrapper: Some(config.deb.use_bootstrapper),
osx_frameworks: config.osx.frameworks,
osx_minimum_system_version: config.osx.minimum_system_version,
osx_license: config.osx.license,
osx_use_bootstrapper: Some(config.osx.use_bootstrapper),
external_bin: config.external_bin,
exception_domain: config.osx.exception_domain,
deb: DebianSettings {
depends: config.deb.depends,
use_bootstrapper: Some(config.deb.use_bootstrapper),
},
macos: MacOSSettings {
frameworks: config.macos.frameworks,
minimum_system_version: config.macos.minimum_system_version,
license: config.macos.license,
use_bootstrapper: Some(config.macos.use_bootstrapper),
exception_domain: config.macos.exception_domain,
},
..Default::default()
})
}
4 changes: 2 additions & 2 deletions cli/core/templates/src-tauri/tauri.conf.json
Expand Up @@ -31,7 +31,7 @@
"depends": [],
"useBootstrapper": false
},
"osx": {
"macOS": {
"frameworks": [],
"minimumSystemVersion": "",
"useBootstrapper": false,
Expand All @@ -54,4 +54,4 @@
"csp": "default-src blob: data: filesystem: ws: http: https: 'unsafe-eval' 'unsafe-inline'"
}
}
}
}
124 changes: 56 additions & 68 deletions cli/tauri-bundler/Readme.md → cli/tauri-bundler/README.md
@@ -1,31 +1,14 @@
# Cargo Tauri Bundle
# Tauri Bundler

Wrap Rust executables in OS-specific app bundles
Wrap Rust executables in OS-specific app bundles.

## About

`cargo tauri-bundle` is a tool used to generate installers or app bundles for GUI
executables built with `cargo`. It can create `.app` bundles for Mac OS X and
iOS, `.deb` packages for Linux, and `.msi` installers for Windows (note however
that iOS and Windows support is still experimental). Support for creating
`.rpm` packages (for Linux) and `.apk` packages (for Android) is still pending.
This is a fork of the awesome [cargo-bundle](https://github.com/burtonageo/cargo-bundle), turned into a library used by the [Tauri CLI](../core).

To install `cargo tauri-bundle`, run `cargo install cargo-tauri-bundle`. This will add the most recent version of `cargo-bundle`
published to [crates.io](https://crates.io/crates/cargo-bundle) as a subcommand to your default `cargo` installation.
## Configuration

To start using `cargo tauri-bundle`, add a `[package.metadata.bundle]` section to your project's `Cargo.toml` file. This
section describes various attributes of the generated bundle, such as its name, icon, description, copyright, as well
as any packaging scripts you need to generate extra data. The full manifest format is described below.

To build a bundle for the OS you're on, simply run `cargo tauri-bundle` in your
project's directory (where the `Cargo.toml` is placed). If you would like to
bundle a release build, you must add the `--release` flag to your call. To
cross-compile and bundle an application for another OS, add an appropriate
`--target` flag, just as you would for `cargo build`.

## Bundle manifest format

There are several fields in the `[package.metadata.bundle]` section.
Tauri automatically loads configurations from the `tauri.conf.json > tauri > bundle` object, but this library doesn't rely on it and can be used by non-Tauri apps.

### General settings

Expand All @@ -39,22 +22,20 @@ These settings apply to bundles for all (or most) OSes.
bundle's `CFBundleIdentifier` value; for Windows, this is hashed to create
an application GUID.
* `icon`: [OPTIONAL] The icons used for your application. This should be an array of file paths or globs (with images
in various sizes/formats); `cargo-bundle` will automatically convert between image formats as necessary for
in various sizes/formats); `tauri-bundler` will automatically convert between image formats as necessary for
different platforms. Supported formats include ICNS, ICO, PNG, and anything else that can be decoded by the
[`image`](https://crates.io/crates/image) crate. Icons intended for high-resolution (e.g. Retina) displays
should have a filename with `@2x` just before the extension (see example below).
* `version`: [OPTIONAL] The version of the application. If this is not present, then it will use the `version`
value from your `Cargo.toml` file.
* `resources`: [OPTIONAL] List of files or directories which will be copied to the resources section of the
bundle. Globs are supported.
* `script`: [OPTIONAL] This is a reserved field; at the moment it is not used for anything, but may be used to
run scripts while packaging the bundle (e.g. download files, compress and encrypt, etc.).
* `copyright`: [OPTIONAL] This contains a copyright string associated with your application.
* `category`: [OPTIONAL] What kind of application this is. This can
be a human-readable string (e.g. `"Puzzle game"`), or a Mac OS X
LSApplicationCategoryType value
(e.g. `"public.app-category.puzzle-games"`), or a GNOME desktop
file category name (e.g. `"LogicGame"`), and `cargo-bundle` will
file category name (e.g. `"LogicGame"`), and `tauri-bundler` will
automatically convert as needed for different platforms.
* `short_description`: [OPTIONAL] A short, one-line description of the application. If this is not present, then it
will use the `description` value from your `Cargo.toml` file.
Expand All @@ -64,72 +45,79 @@ These settings apply to bundles for all (or most) OSes.

These settings are used only when bundling `deb` packages.

* `deb_depends`: A list of strings indicating other packages (e.g. shared
* `depends`: A list of strings indicating other packages (e.g. shared
libraries) that this package depends on to be installed. If present, this
forms the `Depends:` field of the `deb` package control file.
* `use_bootstrapper`: Enables the bootstrapper script, which allows access to the environment variables.

### Mac OS X-specific settings

These settings are used only when bundling `osx` packages.
These settings are used only when bundling `app` and `dmg` packages.

* `osx_frameworks`: A list of strings indicating any Mac OS X frameworks that
* `frameworks`: A list of strings indicating any Mac OS X frameworks that
need to be bundled with the app. Each string can either be the name of a
framework (without the `.framework` extension, e.g. `"SDL2"`), in which case
`cargo-bundle` will search for that framework in the standard install
`tauri-bundler` will search for that framework in the standard install
locations (`~/Library/Frameworks/`, `/Library/Frameworks/`, and
`/Network/Library/Frameworks/`), or a path to a specific framework bundle
(e.g. `./data/frameworks/SDL2.framework`). Note that this setting just makes
`cargo-bundle` copy the specified frameworks into the OS X app bundle (under
`tauri-bundler` copy the specified frameworks into the OS X app bundle (under
`Foobar.app/Contents/Frameworks/`); you are still responsible for (1)
arranging for the compiled binary to link against those frameworks (e.g. by
emitting lines like `cargo:rustc-link-lib=framework=SDL2` from your
`build.rs` script), and (2) embedding the correct rpath in your binary
(e.g. by running `install_name_tool -add_rpath
"@executable_path/../Frameworks" path/to/binary` after compiling).
* `osx_minimum_system_version`: A version string indicating the minimum Mac OS
* `minimum_system_version`: A version string indicating the minimum Mac OS
X version that the bundled app supports (e.g. `"10.11"`). If you are using
this config field, you may also want have your `build.rs` script emit
`cargo:rustc-env=MACOSX_DEPLOYMENT_TARGET=10.11` (or whatever version number
you want) to ensure that the compiled binary has the same minimum version.

### Example `Cargo.toml`:

```toml
[package]
name = "example"
# ...other fields...

[package.metadata.bundle]
name = "ExampleApplication"
identifier = "com.doe.exampleapplication"
icon = ["32x32.png", "128x128.png", "128x128@2x.png"]
version = "1.0.0"
resources = ["assets", "images/**/*.png", "secrets/public_key.txt"]
copyright = "Copyright (c) Jane Doe 2016. All rights reserved."
category = "Developer Tool"
short_description = "An example application."
long_description = """
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.
"""
deb_depends = ["libgl1-mesa-glx", "libsdl2-2.0-0 (>= 2.0.5)"]
osx_frameworks = ["SDL2"]
* `license`: Path to the license file for the DMG bundle.
* `exception_domain`: The exception domain to use on the macOS .app bundle. Allows communication to the outside world e.g. a web server you're shipping.
* `use_bootstrapper`: Enables the bootstrapper script, which allows access to the environment variables.

### Example `tauri.conf.json`:

```json
{
"package": {
"productName": "Your Awesome App",
"version": "0.1.0"
},
"tauri": {
"bundle": {
"active": true,
"identifier": "com.my.app",
"shortDescription": "",
"longDescription": "",
"copyright": "Copyright (c) You 2021. All rights reserved.",
"icon": [
"icons/32x32.png",
"icons/128x128.png",
"icons/128x128@2x.png",
"icons/icon.icns",
"icons/icon.ico"
],
"resources": ["./assets/**/*.png"],
"deb": {
"depends": ["debian-dependency1", "debian-dependency2"],
"useBootstrapper": true
},
"macOS": {
"frameworks": [],
"minimumSystemVersion": "10.11",
"license": "./LICENSE",
"useBootstrapper": true
},
"externalBin": ["./sidecar-app"]
}
}
}
```

## Contributing

`cargo-tauri-bundle` has ambitions to be inclusive project and welcome contributions from anyone. Please abide by the Rust
code of conduct.

## Status

Very early alpha. Expect the format of the `[package.metadata.bundle]` section to change, and there is no guarantee of
stability.

## License
(c) 2017 - present, George Burton, Lucas Fernandes Gonçalves Nogueira, Daniel Thompson-Yvetot, Razvan Stoenescu
(c) 2017 - present, George Burton, Tauri-Apps Organization

This program is licensed either under the terms of the
[Apache Software License](http://www.apache.org/licenses/LICENSE-2.0), or the
Expand Down

0 comments on commit 080f639

Please sign in to comment.