mirror of
https://github.com/tauri-apps/tauri.git
synced 2026-04-11 10:43:31 +02:00
Compare commits
76 Commits
fix/wait-w
...
@tauri-app
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0277596341 | ||
|
|
cbd9629729 | ||
|
|
0079d08ba9 | ||
|
|
effd106adf | ||
|
|
4053ad1b58 | ||
|
|
f010ca5e91 | ||
|
|
6b2b9d6cbf | ||
|
|
b6de1c89c2 | ||
|
|
a3ae2cebbf | ||
|
|
a3f11b4f3b | ||
|
|
4b7370e9e0 | ||
|
|
5bbcaaec89 | ||
|
|
3eb3162404 | ||
|
|
0cbfd8923c | ||
|
|
0a552a868c | ||
|
|
560067cd7e | ||
|
|
6a4ea10274 | ||
|
|
349bbfc5c7 | ||
|
|
32a84650c0 | ||
|
|
b19f16aba1 | ||
|
|
594822aa55 | ||
|
|
e4aa35e083 | ||
|
|
9c16eefa31 | ||
|
|
3242e1c946 | ||
|
|
4a880ca697 | ||
|
|
d1ce9af628 | ||
|
|
ec6065fa4a | ||
|
|
18b5299952 | ||
|
|
eb3f0248c2 | ||
|
|
c03cc586e3 | ||
|
|
488bcea970 | ||
|
|
d48e7a39a7 | ||
|
|
221254738a | ||
|
|
9fb0586909 | ||
|
|
8ee14a8648 | ||
|
|
0f0d6a4e02 | ||
|
|
f9bdb9b230 | ||
|
|
f34acf161d | ||
|
|
87b3cdce48 | ||
|
|
aa1131a047 | ||
|
|
bd8a7cf39d | ||
|
|
f1891540bf | ||
|
|
d15da3daae | ||
|
|
414619c36e | ||
|
|
25757fece4 | ||
|
|
78d15e892d | ||
|
|
6a39f49991 | ||
|
|
a35600cbd7 | ||
|
|
1c53640ac3 | ||
|
|
e7f2d8cba4 | ||
|
|
7322f05792 | ||
|
|
06c75fd98b | ||
|
|
c8a30a61d2 | ||
|
|
650c91c114 | ||
|
|
5a5291d66c | ||
|
|
dbcfaa18d7 | ||
|
|
923b7c7bc6 | ||
|
|
626165eeb4 | ||
|
|
638804e9c4 | ||
|
|
1686296463 | ||
|
|
85baacd18b | ||
|
|
c31c75fffc | ||
|
|
9687a9b4fb | ||
|
|
4acae1ec02 | ||
|
|
d38d90b8d9 | ||
|
|
b52da29d5d | ||
|
|
574a4d4d36 | ||
|
|
1777406a16 | ||
|
|
d3586a2afa | ||
|
|
b7cdb3b39e | ||
|
|
96ecfca428 | ||
|
|
0e616dbbcb | ||
|
|
bc2f0e48ac | ||
|
|
efcc840ff0 | ||
|
|
7897ed257d | ||
|
|
1a018878ab |
@@ -1,5 +0,0 @@
|
||||
---
|
||||
tauri-bundler: "patch:bug"
|
||||
---
|
||||
|
||||
The bundler now sets the `ARCH` env var to the current build target to prevent potential issues with `appimagetool`'s auto-detection.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"tauri": 'patch:bug'
|
||||
---
|
||||
|
||||
Prevent the JavaScript runtime crashing when channel events fire in a webview that no longer has callbacks for the channel.
|
||||
@@ -1,7 +0,0 @@
|
||||
---
|
||||
"tauri": "minor:feat"
|
||||
"@tauri-apps/api": "minor:feat"
|
||||
---
|
||||
|
||||
Expose the `setAutoResize` API for webviews in `@tauri-apps/api`.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"tauri-bundler": patch:bug
|
||||
---
|
||||
|
||||
Fix custom Windows sign command failing to sign app uninstaller if it references relative paths.
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"tauri-cli": "patch:bug"
|
||||
"@tauri-apps/cli": "patch:bug"
|
||||
---
|
||||
|
||||
fix: allow the target directory to be inside frontendDir as long as it is not the Rust target directory inside frontendDir.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"tauri": patch:bug
|
||||
---
|
||||
|
||||
Fixes multiple event listeners registration for iOS plugins.
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"tauri": "minor:bug"
|
||||
"@tauri-apps/api": "minor:bug"
|
||||
---
|
||||
|
||||
Fixed path joining behavior where `path.join('', 'a')` incorrectly returns "/a" instead of "a".
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"tauri-runtime-wry": patch:bug
|
||||
---
|
||||
|
||||
Fix monitor check on the window prevent overflow implementation.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"tauri": patch:bug
|
||||
---
|
||||
|
||||
Fix `TrayIcon.getById` returning a new resource ID instead of reusing a previously created id from `TrayIcon.new`.
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
'tauri': 'patch:bug'
|
||||
---
|
||||
|
||||
Fix JavaScript API `Webview.proxyUrl` had no effect when used in the `Webview` constructor
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"@tauri-apps/api": "minor:feat"
|
||||
---
|
||||
|
||||
Add `Monitor.workArea` field.
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"tauri": "minor:feat"
|
||||
---
|
||||
|
||||
Add `Monitor::work_area` getter
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"tauri": "minor:feat"
|
||||
---
|
||||
|
||||
Added `tauri::PhysicalRect` and `tauri::LogicalRect` types.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
---
|
||||
"tauri-utils": 'minor:feat'
|
||||
"tauri": 'minor:feat'
|
||||
---
|
||||
Adds the option to configure the HTTP `Service-Worker-Allowed` response header in `app > security > headers`
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"@tauri-apps/api": minor:changes
|
||||
"tauri": minor:changes
|
||||
---
|
||||
|
||||
`transformCallback` now registers the callbacks inside `window.__TAURI_INTERNALS__.callbacks` instead of directly on `window['_{id}']`
|
||||
@@ -1,6 +0,0 @@
|
||||
---
|
||||
"@tauri-apps/api": minor:bug
|
||||
"tauri": minor:bug
|
||||
---
|
||||
|
||||
Immediately unregister event listener when the unlisten function is called.
|
||||
34
.github/CONTRIBUTING.md
vendored
34
.github/CONTRIBUTING.md
vendored
@@ -51,7 +51,10 @@ Hi! We, the maintainers, are really excited that you are interested in contribut
|
||||
|
||||
First, [join our Discord server](https://discord.gg/SpmNs4S) and let us know that you want to contribute. This way we can point you in the right direction and help ensure your contribution will be as helpful as possible.
|
||||
|
||||
To set up your machine for development, follow the [Tauri setup guide](https://v2.tauri.app/start/prerequisites/) to get all the tools you need to develop Tauri apps. The only additional tool you may need is [PNPM](https://pnpm.io/), it is only required if you are developing the Node CLI or API packages (`packages/cli` and `packages/api`). Next, fork and clone this repo. It is structured as a monorepo, which means that all the various Tauri packages are under the same repository. The development process varies depending on what part of Tauri you are contributing to, see the guides below for per-package instructions.
|
||||
To set up your machine for development, follow the [Tauri setup guide](https://v2.tauri.app/start/prerequisites/) to get all the tools you need to develop Tauri apps. The only additional tool you may need is [PNPM](https://pnpm.io/), it is only required if you are developing the Node CLI or API packages (`packages/cli` and `packages/api`).
|
||||
|
||||
Next, [fork](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo) and clone [this repository](https://github.com/tauri-apps).
|
||||
The development process varies depending on what part of Tauri you are contributing to, see the guides below for per-package instructions.
|
||||
|
||||
Some Tauri packages will be automatically built when running one of the examples. Others, however, will need to be built beforehand. To initialize, execute these commands in the repository root:
|
||||
|
||||
@@ -64,17 +67,31 @@ pnpm build
|
||||
|
||||
See [Architecture](../ARCHITECTURE.md#major-components) for an overview of the packages in this repository.
|
||||
|
||||
### Developing Tauri Core and Related Components (Rust API, Macros, Codegen, and Utils)
|
||||
|
||||
The code for the Rust crates, including the Core, Macros, Utils, WRY runtime, and a few more are located in the [main Tauri repository](https://github.com/tauri-apps/tauri/tree/dev/crates).
|
||||
|
||||
The easiest way to test your changes is to use the [helloworld](https://github.com/tauri-apps/tauri/tree/dev/examples/helloworld) example app. It automatically rebuilds and uses your local copy of the Tauri core packages. Just run `cargo run --example helloworld` after making changes to test them out.
|
||||
|
||||
To test local changes against your own application simply point the Tauri create to your local repository. In `src-tauri/Cargo.toml` file change:
|
||||
|
||||
`tauri = { version = "2.1.1" }`
|
||||
|
||||
to:
|
||||
|
||||
`tauri = { path = "path/to/local/tauri/crates/tauri" }`
|
||||
|
||||
If any other crates depend on Tauri you will have to point them to the local repo as well.
|
||||
|
||||
### Developing Tauri Bundler and Rust CLI
|
||||
|
||||
The code for the bundler is located in `[Tauri repo root]/crates/tauri-bundler`, and the code for the Rust CLI is located in `[Tauri repo root]/crates/tauri-cli`. If you are using your local copy of `@tauri-apps/cli` (see above), any changes you make to the bundler and CLI will be automatically built and applied when running the build or dev command. Otherwise, running `cargo install --path .` in the Rust CLI directory will allow you to run `cargo tauri build` and `cargo tauri dev` anywhere, using the updated copy of the bundler and cli. You will have to run this command each time you make a change in either package.
|
||||
The code for the bundler is located in [crates/tauri-bundler](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-bundler), and the code for the Rust CLI is located in [tauri-cli](https://github.com/tauri-apps/tauri/tree/dev/crates/tauri-cli).
|
||||
Running `cargo install --path .` in the Rust CLI directory will allow you to run `cargo tauri build` and `cargo tauri dev` anywhere, using the updated copy of the bundler and cli. You will have to run this command each time you make a change in either package.
|
||||
You can use `cargo install --path . --debug` to speed up test builds.
|
||||
|
||||
### Developing The Node.js CLI (`@tauri-apps/cli`)
|
||||
|
||||
`@tauri-apps/cli` is a wrapper to `tauri-cli` so most changes should be written on the Rust CLI. The `[Tauri repo root]/crates/tauri-cli` folder contains only packaging scripts to properly publish the Rust CLI binaries to NPM.
|
||||
|
||||
### Developing Tauri Core and Related Components (Rust API, Macros, Codegen, and Utils)
|
||||
|
||||
The code for the Rust crates, including the Core, Macros, Utils, WRY runtime, and a few more are located in `[Tauri repo root]/crates/tauri-(macros/utils)`. The easiest way to test your changes is to use the `[Tauri repo root]/examples/helloworld` app. It automatically rebuilds and uses your local copy of the Tauri core packages. Just run `cargo run --example helloworld` after making changes to test them out.
|
||||
[`@tauri-apps/cli`](https://github.com/tauri-apps/tauri/tree/dev/packages/cli) is a small wrapper around `tauri-cli` so most changes should be happen in the Rust CLI (see above).
|
||||
|
||||
#### Building the documentation locally
|
||||
|
||||
@@ -86,7 +103,8 @@ $ RUSTDOCFLAGS="--cfg docsrs" cargo +nightly doc --all-features --open
|
||||
|
||||
### Developing the JS API
|
||||
|
||||
The JS API provides bindings between the developer's JS in the Webview and the builtin Tauri APIs, written in Rust. Its code is located in `[Tauri repo root]/packages/api`. After making changes to the code, run `pnpm build` to build it. To test your changes, we recommend using the API example app, located in `[Tauri repo root]/examples/api`. It will automatically use your local copy of the JS API and provides a helpful UI to test the various commands.
|
||||
The JS API provides bindings between the developer's JS in the Webview and the built-in Tauri APIs, written in Rust. Its code is located in [/packages/api](https://github.com/tauri-apps/tauri/tree/dev/packages/api).
|
||||
After making changes to the code, run `pnpm build` to build it. To test your changes, we recommend using the API example app, located in [/examples/api](https://github.com/tauri-apps/tauri/tree/dev/examples/api). It will automatically use your local copy of the JS API and provides a helpful UI to test the various commands.
|
||||
|
||||
## Financial Contribution
|
||||
|
||||
|
||||
5
.github/RELEASING.md
vendored
5
.github/RELEASING.md
vendored
@@ -33,11 +33,6 @@ Releasing can be as easy as merging the version pull request but here is a check
|
||||
|
||||
- [ ] Double check that every package is bumped correctly and there are no accidental major or minor being released unless that is indeed the intention.
|
||||
- [ ] Make sure that there are no pending or unfinished [covector-version-or-publish.yml](./workflows/covector-version-or-publish.yml) workflow runs.
|
||||
- [ ] Sign the Version PR before merging as we require signed commits
|
||||
- [ ] `git fetch --all`
|
||||
- [ ] `git checkout release/version-updates`
|
||||
- [ ] `git commit --amend -S`
|
||||
- [ ] `git push --force`
|
||||
- [ ] Approve and merge the version pull request
|
||||
|
||||
## Publishing failed, what to do?
|
||||
|
||||
2
.github/workflows/check-generated-files.yml
vendored
2
.github/workflows/check-generated-files.yml
vendored
@@ -8,6 +8,7 @@ on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/check-generated-files.yml'
|
||||
- 'pnpm-lock.yaml'
|
||||
- 'packages/api/src/**'
|
||||
- 'crates/tauri/scripts/bundle.global.js'
|
||||
- 'crates/tauri-utils/src/config.rs'
|
||||
@@ -31,6 +32,7 @@ jobs:
|
||||
with:
|
||||
filters: |
|
||||
api:
|
||||
- 'pnpm-lock.yaml'
|
||||
- 'packages/api/src/**'
|
||||
- 'crates/tauri/scripts/bundle.global.js'
|
||||
schema:
|
||||
|
||||
@@ -119,6 +119,7 @@ jobs:
|
||||
commit-message: 'apply version updates'
|
||||
labels: 'version updates'
|
||||
body: ${{ steps.covector.outputs.change }}
|
||||
sign-commits: true
|
||||
|
||||
- name: Trigger doc update
|
||||
if: |
|
||||
|
||||
4
.github/workflows/test-core.yml
vendored
4
.github/workflows/test-core.yml
vendored
@@ -90,7 +90,7 @@ jobs:
|
||||
|
||||
- uses: Swatinem/rust-cache@v2
|
||||
with:
|
||||
prefix-key: v2
|
||||
prefix-key: v3
|
||||
save-if: ${{ matrix.features.key == 'all' }}
|
||||
|
||||
- name: test
|
||||
@@ -100,5 +100,5 @@ jobs:
|
||||
- name: test (using cross)
|
||||
if: ${{ matrix.platform.cross }}
|
||||
run: |
|
||||
cargo install cross --git https://github.com/cross-rs/cross --rev ac4c11cedc97cd7c27faed36e55377a90e6ed618 --locked
|
||||
cargo install cross --git https://github.com/cross-rs/cross --rev 51f46f296253d8122c927c5bb933e3c4f27cc317 --locked
|
||||
cross ${{ matrix.platform.command }} --target ${{ matrix.platform.target }} ${{ matrix.features.args }} --manifest-path crates/tauri/Cargo.toml
|
||||
|
||||
785
Cargo.lock
generated
785
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -52,7 +52,7 @@ fn main() {
|
||||
.expect("Something wrong with tauri_data"),
|
||||
&serde_json::to_value(all_data).expect("Unable to build final json (all)"),
|
||||
)
|
||||
.unwrap_or_else(|_| panic!("Unable to write {:?}", tauri_data));
|
||||
.unwrap_or_else(|_| panic!("Unable to write {tauri_data:?}"));
|
||||
|
||||
utils::write_json(
|
||||
tauri_recent
|
||||
@@ -60,5 +60,5 @@ fn main() {
|
||||
.expect("Something wrong with tauri_recent"),
|
||||
&serde_json::to_value(recent).expect("Unable to build final json (recent)"),
|
||||
)
|
||||
.unwrap_or_else(|_| panic!("Unable to write {:?}", tauri_recent));
|
||||
.unwrap_or_else(|_| panic!("Unable to write {tauri_recent:?}"));
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ fn run_max_mem_benchmark() -> Result<HashMap<String, u64>> {
|
||||
let mut results = HashMap::<String, u64>::new();
|
||||
|
||||
for (name, example_exe) in get_all_benchmarks() {
|
||||
let benchmark_file = utils::target_dir().join(format!("mprof{}_.dat", name));
|
||||
let benchmark_file = utils::target_dir().join(format!("mprof{name}_.dat"));
|
||||
let benchmark_file = benchmark_file.to_str().unwrap();
|
||||
|
||||
let proc = Command::new("mprof")
|
||||
@@ -105,7 +105,7 @@ fn run_max_mem_benchmark() -> Result<HashMap<String, u64>> {
|
||||
.spawn()?;
|
||||
|
||||
let proc_result = proc.wait_with_output()?;
|
||||
println!("{:?}", proc_result);
|
||||
println!("{proc_result:?}");
|
||||
results.insert(
|
||||
name.to_string(),
|
||||
utils::parse_max_mem(benchmark_file).unwrap(),
|
||||
@@ -126,11 +126,11 @@ fn rlib_size(target_dir: &std::path::Path, prefix: &str) -> u64 {
|
||||
if name.starts_with(prefix) && name.ends_with(".rlib") {
|
||||
let start = name.split('-').next().unwrap().to_string();
|
||||
if seen.contains(&start) {
|
||||
println!("skip {}", name);
|
||||
println!("skip {name}");
|
||||
} else {
|
||||
seen.insert(start);
|
||||
size += entry.metadata().unwrap().len();
|
||||
println!("check size {} {}", name, size);
|
||||
println!("check size {name} {size}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -142,7 +142,7 @@ fn get_binary_sizes(target_dir: &Path) -> Result<HashMap<String, u64>> {
|
||||
let mut sizes = HashMap::<String, u64>::new();
|
||||
|
||||
let wry_size = rlib_size(target_dir, "libwry");
|
||||
println!("wry {} bytes", wry_size);
|
||||
println!("wry {wry_size} bytes");
|
||||
sizes.insert("wry_rlib".to_string(), wry_size);
|
||||
|
||||
// add size for all EXEC_TIME_BENCHMARKS
|
||||
|
||||
@@ -96,8 +96,8 @@ pub fn run_collect(cmd: &[&str]) -> (String, String) {
|
||||
let stdout = String::from_utf8_lossy(&stdout).to_string();
|
||||
let stderr = String::from_utf8_lossy(&stderr).to_string();
|
||||
if !status.success() {
|
||||
eprintln!("stdout: <<<{}>>>", stdout);
|
||||
eprintln!("stderr: <<<{}>>>", stderr);
|
||||
eprintln!("stdout: <<<{stdout}>>>");
|
||||
eprintln!("stderr: <<<{stderr}>>>");
|
||||
panic!("Unexpected exit code: {:?}", status.code());
|
||||
}
|
||||
(stdout, stderr)
|
||||
@@ -230,7 +230,7 @@ pub fn download_file(url: &str, filename: PathBuf) {
|
||||
|
||||
// Downloading with curl this saves us from adding
|
||||
// a Rust HTTP client dependency.
|
||||
println!("Downloading {}", url);
|
||||
println!("Downloading {url}");
|
||||
let status = Command::new("curl")
|
||||
.arg("-L")
|
||||
.arg("-s")
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.2.1]
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Upgraded to `tauri-codegen@2.3.0`
|
||||
- Upgraded to `tauri-utils@2.5.0`
|
||||
|
||||
## \[2.2.0]
|
||||
|
||||
### Dependencies
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-build"
|
||||
version = "2.2.0"
|
||||
version = "2.3.0"
|
||||
description = "build time code to pair with https://crates.io/crates/tauri"
|
||||
exclude = ["CHANGELOG.md", "/target"]
|
||||
readme = "README.md"
|
||||
@@ -28,8 +28,8 @@ rustdoc-args = ["--cfg", "docsrs"]
|
||||
[dependencies]
|
||||
anyhow = "1"
|
||||
quote = { version = "1", optional = true }
|
||||
tauri-codegen = { version = "2.2.0", path = "../tauri-codegen", optional = true }
|
||||
tauri-utils = { version = "2.4.0", path = "../tauri-utils", features = [
|
||||
tauri-codegen = { version = "2.3.0", path = "../tauri-codegen", optional = true }
|
||||
tauri-utils = { version = "2.5.0", path = "../tauri-utils", features = [
|
||||
"build",
|
||||
"resources",
|
||||
] }
|
||||
@@ -44,8 +44,8 @@ semver = "1"
|
||||
dirs = "6"
|
||||
glob = "0.3"
|
||||
toml = "0.8"
|
||||
# Our code requires at least 0.8.18 so don't simplify this to 0.8
|
||||
schemars = { version = "0.8.18", features = ["preserve_order"] }
|
||||
# Our code requires at least 0.8.21 so don't simplify this to 0.8
|
||||
schemars = { version = "0.8.21", features = ["preserve_order"] }
|
||||
|
||||
[features]
|
||||
default = ["config-json"]
|
||||
|
||||
@@ -437,7 +437,7 @@ pub fn build(out_dir: &Path, target: Target, attributes: &Attributes) -> super::
|
||||
permissions_map.insert(APP_ACL_KEY.to_string(), app_acl.permission_files);
|
||||
}
|
||||
|
||||
tauri_utils::acl::build::generate_allowed_commands(out_dir, permissions_map)?;
|
||||
tauri_utils::acl::build::generate_allowed_commands(out_dir, Some(capabilities), permissions_map)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -367,6 +367,8 @@ impl Attributes {
|
||||
|
||||
/// Set the glob pattern to be used to find the capabilities.
|
||||
///
|
||||
/// **WARNING:** The `removeUnusedCommands` option does not work with a custom capabilities path.
|
||||
///
|
||||
/// **Note:** You must emit [rerun-if-changed] instructions for your capabilities directory.
|
||||
///
|
||||
/// [rerun-if-changed]: https://doc.rust-lang.org/cargo/reference/build-scripts.html#rerun-if-changed
|
||||
@@ -528,7 +530,7 @@ pub fn try_build(attributes: Attributes) -> Result<()> {
|
||||
|
||||
if let Some(paths) = &config.bundle.external_bin {
|
||||
copy_binaries(
|
||||
ResourcePaths::new(external_binaries(paths, &target_triple).as_slice(), true),
|
||||
ResourcePaths::new(&external_binaries(paths, &target_triple, &target), true),
|
||||
&target_triple,
|
||||
target_dir,
|
||||
manifest.package.as_ref().map(|p| &p.name),
|
||||
|
||||
@@ -1,5 +1,23 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.5.0]
|
||||
|
||||
### New Features
|
||||
|
||||
- [`414619c36`](https://www.github.com/tauri-apps/tauri/commit/414619c36e94e21939534dd72c0438b93da75546) ([#13536](https://www.github.com/tauri-apps/tauri/pull/13536) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) Added support for the `bundleName` property in the macOS bundler configuration. This allows specifying the `CFBundleName` value for generated macOS bundles.
|
||||
- [`7322f0579`](https://www.github.com/tauri-apps/tauri/commit/7322f057923aaec88960ad5556776774b745762f) ([#13502](https://www.github.com/tauri-apps/tauri/pull/13502) by [@amrbashir](https://www.github.com/tauri-apps/tauri/../../amrbashir)) Allow using `CheckIfAppIsRunning` macro inside NSIS hooks, for example `!insertmacro CheckIfAppIsRunning "another-executable.exe" "Another Executable"`.
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`479cee3d3`](https://www.github.com/tauri-apps/tauri/commit/479cee3d3680f9020005bdfb380d3a9482e286a1) ([#13260](https://www.github.com/tauri-apps/tauri/pull/13260) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) The bundler now sets the `ARCH` env var to the current build target to prevent potential issues with `appimagetool`'s auto-detection.
|
||||
- [`e045fe32c`](https://www.github.com/tauri-apps/tauri/commit/e045fe32c9b0bed954916dc42528e28ee19f75b8) ([#13334](https://www.github.com/tauri-apps/tauri/pull/13334) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Fix custom Windows sign command failing to sign app uninstaller if it references relative paths.
|
||||
- [`bd8a7cf39`](https://www.github.com/tauri-apps/tauri/commit/bd8a7cf39df316bf27c73a303d5e650301af0104) ([#13581](https://www.github.com/tauri-apps/tauri/pull/13581) by [@martpie](https://www.github.com/tauri-apps/tauri/../../martpie)) Fixes app icon not being displayed on Gnome dock and grid view when using Wayland.
|
||||
- [`b52da29d5`](https://www.github.com/tauri-apps/tauri/commit/b52da29d5dbdb675ddba438a335e6a59f620e536) ([#13429](https://www.github.com/tauri-apps/tauri/pull/13429) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix `mainBinaryName` doesn't work when there's `.` in it
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Upgraded to `tauri-utils@2.5.0`
|
||||
|
||||
## \[2.4.0]
|
||||
|
||||
### New Features
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-bundler"
|
||||
version = "2.4.0"
|
||||
version = "2.5.0"
|
||||
authors = [
|
||||
"George Burton <burtonageo@gmail.com>",
|
||||
"Tauri Programme within The Commons Conservancy",
|
||||
@@ -15,7 +15,7 @@ rust-version = "1.77.2"
|
||||
exclude = ["CHANGELOG.md", "/target", "rustfmt.toml"]
|
||||
|
||||
[dependencies]
|
||||
tauri-utils = { version = "2.4.0", path = "../tauri-utils", features = [
|
||||
tauri-utils = { version = "2.5.0", path = "../tauri-utils", features = [
|
||||
"resources",
|
||||
] }
|
||||
image = "0.25"
|
||||
@@ -38,7 +38,7 @@ hex = "0.4"
|
||||
semver = "1"
|
||||
sha1 = "0.10"
|
||||
sha2 = "0.10"
|
||||
zip = { version = "2", default-features = false, features = ["deflate"] }
|
||||
zip = { version = "4", default-features = false, features = ["deflate"] }
|
||||
dunce = "1"
|
||||
url = "2"
|
||||
uuid = { version = "1", features = ["v4", "v5"] }
|
||||
@@ -50,7 +50,7 @@ windows-registry = "0.5"
|
||||
glob = "0.3"
|
||||
|
||||
[target."cfg(target_os = \"windows\")".dependencies.windows-sys]
|
||||
version = "0.59"
|
||||
version = "0.60"
|
||||
features = ["Win32_System_SystemInformation", "Win32_System_Diagnostics_Debug"]
|
||||
|
||||
[target."cfg(target_os = \"macos\")".dependencies]
|
||||
@@ -62,7 +62,7 @@ tauri-macos-sign = { version = "2.1.0", path = "../tauri-macos-sign" }
|
||||
[target."cfg(target_os = \"linux\")".dependencies]
|
||||
heck = "0.5"
|
||||
ar = "0.9"
|
||||
md5 = "0.7"
|
||||
md5 = "0.8"
|
||||
rpm = { version = "0.16", features = ["bzip2-compression"] }
|
||||
|
||||
[target."cfg(unix)".dependencies]
|
||||
|
||||
@@ -13,7 +13,7 @@ mod settings;
|
||||
mod updater_bundle;
|
||||
mod windows;
|
||||
|
||||
use tauri_utils::display_path;
|
||||
use tauri_utils::{display_path, platform::Target as TargetPlatform};
|
||||
|
||||
pub use self::{
|
||||
category::AppCategory,
|
||||
@@ -48,19 +48,14 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<Bundle>> {
|
||||
|
||||
package_types.sort_by_key(|a| a.priority());
|
||||
|
||||
let target_os = settings
|
||||
.target()
|
||||
.split('-')
|
||||
.nth(2)
|
||||
.unwrap_or(std::env::consts::OS)
|
||||
.replace("darwin", "macos");
|
||||
let target_os = settings.target_platform();
|
||||
|
||||
if target_os != std::env::consts::OS {
|
||||
if *target_os != TargetPlatform::current() {
|
||||
log::warn!("Cross-platform compilation is experimental and does not support all features. Please use a matching host system for full compatibility.");
|
||||
}
|
||||
|
||||
// Sign windows binaries before the bundling step in case neither wix and nsis bundles are enabled
|
||||
if target_os == "windows" {
|
||||
if matches!(target_os, TargetPlatform::Windows) {
|
||||
if settings.can_sign() {
|
||||
for bin in settings.binaries() {
|
||||
let bin_path = settings.binary_path(bin);
|
||||
|
||||
@@ -27,8 +27,7 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
|
||||
Arch::Armhf => "armhf",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"Unsupported architecture: {:?}",
|
||||
target
|
||||
"Unsupported architecture: {target:?}"
|
||||
)));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -49,8 +49,7 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
|
||||
Arch::Riscv64 => "riscv64",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"Unsupported architecture: {:?}",
|
||||
target
|
||||
"Unsupported architecture: {target:?}"
|
||||
)));
|
||||
}
|
||||
};
|
||||
@@ -164,7 +163,7 @@ fn generate_control_file(
|
||||
let dest_path = control_dir.join("control");
|
||||
let mut file = fs_utils::create_file(&dest_path)?;
|
||||
let package = heck::AsKebabCase(settings.product_name());
|
||||
writeln!(file, "Package: {}", package)?;
|
||||
writeln!(file, "Package: {package}")?;
|
||||
writeln!(file, "Version: {}", settings.version_string())?;
|
||||
writeln!(file, "Architecture: {arch}")?;
|
||||
// Installed-Size must be divided by 1024, see https://www.debian.org/doc/debian-policy/ch-controlfields.html#installed-size
|
||||
@@ -183,16 +182,16 @@ fn generate_control_file(
|
||||
|
||||
writeln!(file, "Maintainer: {authors}")?;
|
||||
if let Some(section) = &settings.deb().section {
|
||||
writeln!(file, "Section: {}", section)?;
|
||||
writeln!(file, "Section: {section}")?;
|
||||
}
|
||||
if let Some(priority) = &settings.deb().priority {
|
||||
writeln!(file, "Priority: {}", priority)?;
|
||||
writeln!(file, "Priority: {priority}")?;
|
||||
} else {
|
||||
writeln!(file, "Priority: optional")?;
|
||||
}
|
||||
|
||||
if let Some(homepage) = settings.homepage_url() {
|
||||
writeln!(file, "Homepage: {}", homepage)?;
|
||||
writeln!(file, "Homepage: {homepage}")?;
|
||||
}
|
||||
|
||||
let dependencies = settings.deb().depends.as_ref().cloned().unwrap_or_default();
|
||||
@@ -305,7 +304,7 @@ fn generate_md5sums(control_dir: &Path, data_dir: &Path) -> crate::Result<()> {
|
||||
let mut file = File::open(path)?;
|
||||
let mut hash = md5::Context::new();
|
||||
io::copy(&mut file, &mut hash)?;
|
||||
for byte in hash.compute().iter() {
|
||||
for byte in hash.finalize().iter() {
|
||||
write!(md5sums_file, "{byte:02x}")?;
|
||||
}
|
||||
let rel_path = path.strip_prefix(data_dir)?;
|
||||
|
||||
@@ -4,6 +4,7 @@ Categories={{categories}}
|
||||
Comment={{comment}}
|
||||
{{/if}}
|
||||
Exec={{exec}}
|
||||
StartupWMClass={{exec}}
|
||||
Icon={{icon}}
|
||||
Name={{name}}
|
||||
Terminal=false
|
||||
|
||||
@@ -32,8 +32,7 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
|
||||
Arch::Riscv64 => "riscv64",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"Unsupported architecture: {:?}",
|
||||
target
|
||||
"Unsupported architecture: {target:?}"
|
||||
)));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -65,15 +65,11 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
|
||||
|
||||
if app_bundle_path.exists() {
|
||||
fs::remove_dir_all(&app_bundle_path)
|
||||
.with_context(|| format!("Failed to remove old {}", app_product_name))?;
|
||||
.with_context(|| format!("Failed to remove old {app_product_name}"))?;
|
||||
}
|
||||
let bundle_directory = app_bundle_path.join("Contents");
|
||||
fs::create_dir_all(&bundle_directory).with_context(|| {
|
||||
format!(
|
||||
"Failed to create bundle directory at {:?}",
|
||||
bundle_directory
|
||||
)
|
||||
})?;
|
||||
fs::create_dir_all(&bundle_directory)
|
||||
.with_context(|| format!("Failed to create bundle directory at {bundle_directory:?}"))?;
|
||||
|
||||
let resources_dir = bundle_directory.join("Resources");
|
||||
let bin_dir = bundle_directory.join("MacOS");
|
||||
@@ -160,7 +156,7 @@ fn copy_binaries_to_bundle(
|
||||
let bin_path = settings.binary_path(bin);
|
||||
let dest_path = dest_dir.join(bin.name());
|
||||
fs_utils::copy_file(&bin_path, &dest_path)
|
||||
.with_context(|| format!("Failed to copy binary from {:?}", bin_path))?;
|
||||
.with_context(|| format!("Failed to copy binary from {bin_path:?}"))?;
|
||||
paths.push(dest_path);
|
||||
}
|
||||
Ok(paths)
|
||||
@@ -176,10 +172,10 @@ fn copy_custom_files_to_bundle(bundle_directory: &Path, settings: &Settings) ->
|
||||
};
|
||||
if path.is_file() {
|
||||
fs_utils::copy_file(path, &bundle_directory.join(contents_path))
|
||||
.with_context(|| format!("Failed to copy file {:?} to {:?}", path, contents_path))?;
|
||||
.with_context(|| format!("Failed to copy file {path:?} to {contents_path:?}"))?;
|
||||
} else {
|
||||
fs_utils::copy_dir(path, &bundle_directory.join(contents_path))
|
||||
.with_context(|| format!("Failed to copy directory {:?} to {:?}", path, contents_path))?;
|
||||
.with_context(|| format!("Failed to copy directory {path:?} to {contents_path:?}"))?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
@@ -214,7 +210,15 @@ fn create_info_plist(
|
||||
settings.bundle_identifier().into(),
|
||||
);
|
||||
plist.insert("CFBundleInfoDictionaryVersion".into(), "6.0".into());
|
||||
plist.insert("CFBundleName".into(), settings.product_name().into());
|
||||
if let Some(bundle_name) = settings
|
||||
.macos()
|
||||
.bundle_name
|
||||
.as_deref()
|
||||
.unwrap_or_else(|| settings.product_name())
|
||||
.into()
|
||||
{
|
||||
plist.insert("CFBundleName".into(), bundle_name.into());
|
||||
}
|
||||
plist.insert("CFBundlePackageType".into(), "APPL".into());
|
||||
plist.insert(
|
||||
"CFBundleShortVersionString".into(),
|
||||
@@ -351,7 +355,7 @@ fn create_info_plist(
|
||||
|
||||
// Copies the framework under `{src_dir}/{framework}.framework` to `{dest_dir}/{framework}.framework`.
|
||||
fn copy_framework_from(dest_dir: &Path, framework: &str, src_dir: &Path) -> crate::Result<bool> {
|
||||
let src_name = format!("{}.framework", framework);
|
||||
let src_name = format!("{framework}.framework");
|
||||
let src_path = src_dir.join(&src_name);
|
||||
if src_path.exists() {
|
||||
fs_utils::copy_dir(&src_path, &dest_dir.join(&src_name))?;
|
||||
@@ -379,7 +383,7 @@ fn copy_frameworks_to_bundle(
|
||||
}
|
||||
let dest_dir = bundle_directory.join("Frameworks");
|
||||
fs::create_dir_all(bundle_directory)
|
||||
.with_context(|| format!("Failed to create Frameworks directory at {:?}", dest_dir))?;
|
||||
.with_context(|| format!("Failed to create Frameworks directory at {dest_dir:?}"))?;
|
||||
for framework in frameworks.iter() {
|
||||
if framework.ends_with(".framework") {
|
||||
let src_path = PathBuf::from(framework);
|
||||
@@ -394,8 +398,7 @@ fn copy_frameworks_to_bundle(
|
||||
let src_path = PathBuf::from(framework);
|
||||
if !src_path.exists() {
|
||||
return Err(crate::Error::GenericError(format!(
|
||||
"Library not found: {}",
|
||||
framework
|
||||
"Library not found: {framework}"
|
||||
)));
|
||||
}
|
||||
let src_name = src_path.file_name().expect("Couldn't get library filename");
|
||||
@@ -408,8 +411,7 @@ fn copy_frameworks_to_bundle(
|
||||
continue;
|
||||
} else if framework.contains('/') {
|
||||
return Err(crate::Error::GenericError(format!(
|
||||
"Framework path should have .framework extension: {}",
|
||||
framework
|
||||
"Framework path should have .framework extension: {framework}"
|
||||
)));
|
||||
}
|
||||
if let Some(home_dir) = dirs::home_dir() {
|
||||
@@ -427,8 +429,7 @@ fn copy_frameworks_to_bundle(
|
||||
continue;
|
||||
}
|
||||
return Err(crate::Error::GenericError(format!(
|
||||
"Could not locate framework: {}",
|
||||
framework
|
||||
"Could not locate framework: {framework}"
|
||||
)));
|
||||
}
|
||||
Ok(paths)
|
||||
|
||||
@@ -49,8 +49,7 @@ pub fn bundle_project(settings: &Settings, bundles: &[Bundle]) -> crate::Result<
|
||||
Arch::Universal => "universal",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"Unsupported architecture: {:?}",
|
||||
target
|
||||
"Unsupported architecture: {target:?}"
|
||||
)));
|
||||
}
|
||||
}
|
||||
@@ -59,7 +58,7 @@ pub fn bundle_project(settings: &Settings, bundles: &[Bundle]) -> crate::Result<
|
||||
let dmg_path = output_path.join(&dmg_name);
|
||||
|
||||
let product_name = settings.product_name();
|
||||
let bundle_file_name = format!("{}.app", product_name);
|
||||
let bundle_file_name = format!("{product_name}.app");
|
||||
let bundle_dir = settings.project_out_directory().join("bundle/macos");
|
||||
|
||||
let support_directory_path = output_path
|
||||
@@ -69,10 +68,10 @@ pub fn bundle_project(settings: &Settings, bundles: &[Bundle]) -> crate::Result<
|
||||
|
||||
for path in &[&support_directory_path, &output_path] {
|
||||
if path.exists() {
|
||||
fs::remove_dir_all(path).with_context(|| format!("Failed to remove old {}", dmg_name))?;
|
||||
fs::remove_dir_all(path).with_context(|| format!("Failed to remove old {dmg_name}"))?;
|
||||
}
|
||||
fs::create_dir_all(path)
|
||||
.with_context(|| format!("Failed to create output directory at {:?}", path))?;
|
||||
.with_context(|| format!("Failed to create output directory at {path:?}"))?;
|
||||
}
|
||||
|
||||
// create paths for script
|
||||
|
||||
@@ -45,16 +45,16 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
|
||||
|
||||
if app_bundle_path.exists() {
|
||||
fs::remove_dir_all(&app_bundle_path)
|
||||
.with_context(|| format!("Failed to remove old {}", app_product_name))?;
|
||||
.with_context(|| format!("Failed to remove old {app_product_name}"))?;
|
||||
}
|
||||
fs::create_dir_all(&app_bundle_path)
|
||||
.with_context(|| format!("Failed to create bundle directory at {:?}", app_bundle_path))?;
|
||||
.with_context(|| format!("Failed to create bundle directory at {app_bundle_path:?}"))?;
|
||||
|
||||
for src in settings.resource_files() {
|
||||
let src = src?;
|
||||
let dest = app_bundle_path.join(tauri_utils::resources::resource_relpath(&src));
|
||||
fs_utils::copy_file(&src, &dest)
|
||||
.with_context(|| format!("Failed to copy resource file {:?}", src))?;
|
||||
.with_context(|| format!("Failed to copy resource file {src:?}"))?;
|
||||
}
|
||||
|
||||
let icon_filenames = generate_icon_files(&app_bundle_path, settings)
|
||||
@@ -65,7 +65,7 @@ pub fn bundle_project(settings: &Settings) -> crate::Result<Vec<PathBuf>> {
|
||||
for bin in settings.binaries() {
|
||||
let bin_path = settings.binary_path(bin);
|
||||
fs_utils::copy_file(&bin_path, &app_bundle_path.join(bin.name()))
|
||||
.with_context(|| format!("Failed to copy binary from {:?}", bin_path))?;
|
||||
.with_context(|| format!("Failed to copy binary from {bin_path:?}"))?;
|
||||
}
|
||||
|
||||
Ok(vec![app_bundle_path])
|
||||
@@ -197,7 +197,7 @@ fn generate_info_plist(
|
||||
if !icon_filenames.is_empty() {
|
||||
writeln!(file, " <key>CFBundleIconFiles</key>\n <array>")?;
|
||||
for filename in icon_filenames {
|
||||
writeln!(file, " <string>{}</string>", filename)?;
|
||||
writeln!(file, " <string>{filename}</string>")?;
|
||||
}
|
||||
writeln!(file, " </array>")?;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ use tauri_utils::{
|
||||
BundleType, DeepLinkProtocol, FileAssociation, NSISInstallerMode, NsisCompression,
|
||||
RpmCompression,
|
||||
},
|
||||
platform::Target as TargetPlatform,
|
||||
resources::{external_binaries, ResourcePaths},
|
||||
};
|
||||
|
||||
@@ -332,6 +333,10 @@ pub struct MacOsSettings {
|
||||
pub files: HashMap<PathBuf, PathBuf>,
|
||||
/// The version of the build that identifies an iteration of the bundle.
|
||||
pub bundle_version: Option<String>,
|
||||
/// The name of the build that identifies a string of the bundle.
|
||||
///
|
||||
/// If not set, defaults to the package's product name.
|
||||
pub bundle_name: Option<String>,
|
||||
/// A version string indicating the minimum MacOS 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`.
|
||||
pub minimum_system_version: Option<String>,
|
||||
@@ -760,6 +765,8 @@ pub struct Settings {
|
||||
bundle_settings: BundleSettings,
|
||||
/// the binaries to bundle.
|
||||
binaries: Vec<BundleBinary>,
|
||||
/// The target platform.
|
||||
target_platform: TargetPlatform,
|
||||
/// The target triple.
|
||||
target: String,
|
||||
}
|
||||
@@ -855,6 +862,7 @@ impl SettingsBuilder {
|
||||
} else {
|
||||
target_triple()?
|
||||
};
|
||||
let target_platform = TargetPlatform::from_triple(&target);
|
||||
|
||||
Ok(Settings {
|
||||
log_level: self.log_level.unwrap_or(log::Level::Error),
|
||||
@@ -872,9 +880,10 @@ impl SettingsBuilder {
|
||||
.bundle_settings
|
||||
.external_bin
|
||||
.as_ref()
|
||||
.map(|bins| external_binaries(bins, &target)),
|
||||
.map(|bins| external_binaries(bins, &target, &target_platform)),
|
||||
..self.bundle_settings
|
||||
},
|
||||
target_platform,
|
||||
target,
|
||||
})
|
||||
}
|
||||
@@ -901,6 +910,11 @@ impl Settings {
|
||||
&self.target
|
||||
}
|
||||
|
||||
/// Returns the [`TargetPlatform`].
|
||||
pub fn target_platform(&self) -> &TargetPlatform {
|
||||
&self.target_platform
|
||||
}
|
||||
|
||||
/// Returns the architecture for the binary being bundled (e.g. "arm", "x86" or "x86_64").
|
||||
pub fn binary_arch(&self) -> Arch {
|
||||
if self.target.starts_with("x86_64") {
|
||||
@@ -955,19 +969,23 @@ impl Settings {
|
||||
|
||||
/// Returns the path to the specified binary.
|
||||
pub fn binary_path(&self, binary: &BundleBinary) -> PathBuf {
|
||||
let target_os = self
|
||||
.target()
|
||||
.split('-')
|
||||
.nth(2)
|
||||
.unwrap_or(std::env::consts::OS);
|
||||
let target_os = self.target_platform();
|
||||
|
||||
let path = self.project_out_directory.join(binary.name());
|
||||
let mut path = self.project_out_directory.join(binary.name());
|
||||
|
||||
if target_os == "windows" {
|
||||
path.with_extension("exe")
|
||||
} else {
|
||||
path
|
||||
}
|
||||
if matches!(target_os, TargetPlatform::Windows) {
|
||||
// Append the `.exe` extension without overriding the existing extensions
|
||||
let extension = if let Some(extension) = path.extension() {
|
||||
let mut extension = extension.to_os_string();
|
||||
extension.push(".exe");
|
||||
extension
|
||||
} else {
|
||||
"exe".into()
|
||||
};
|
||||
path.set_extension(extension);
|
||||
};
|
||||
|
||||
path
|
||||
}
|
||||
|
||||
/// Returns the list of binaries to bundle.
|
||||
@@ -985,18 +1003,13 @@ impl Settings {
|
||||
///
|
||||
/// Fails if the host/target's native package type is not supported.
|
||||
pub fn package_types(&self) -> crate::Result<Vec<PackageType>> {
|
||||
let target_os = self
|
||||
.target
|
||||
.split('-')
|
||||
.nth(2)
|
||||
.unwrap_or(std::env::consts::OS)
|
||||
.replace("darwin", "macos");
|
||||
let target_os = self.target_platform();
|
||||
|
||||
let platform_types = match target_os.as_str() {
|
||||
"macos" => vec![PackageType::MacOsBundle, PackageType::Dmg],
|
||||
"ios" => vec![PackageType::IosBundle],
|
||||
"linux" => vec![PackageType::Deb, PackageType::Rpm, PackageType::AppImage],
|
||||
"windows" => vec![PackageType::WindowsMsi, PackageType::Nsis],
|
||||
let platform_types = match target_os {
|
||||
TargetPlatform::MacOS => vec![PackageType::MacOsBundle, PackageType::Dmg],
|
||||
TargetPlatform::Ios => vec![PackageType::IosBundle],
|
||||
TargetPlatform::Linux => vec![PackageType::Deb, PackageType::Rpm, PackageType::AppImage],
|
||||
TargetPlatform::Windows => vec![PackageType::WindowsMsi, PackageType::Nsis],
|
||||
os => {
|
||||
return Err(crate::Error::GenericError(format!(
|
||||
"Native {os} bundles not yet supported."
|
||||
|
||||
@@ -14,7 +14,7 @@ use crate::{
|
||||
utils::fs_utils,
|
||||
Settings,
|
||||
};
|
||||
use tauri_utils::display_path;
|
||||
use tauri_utils::{display_path, platform::Target as TargetPlatform};
|
||||
|
||||
use std::{
|
||||
fs::{self, File},
|
||||
@@ -27,14 +27,9 @@ use zip::write::SimpleFileOptions;
|
||||
|
||||
// Build update
|
||||
pub fn bundle_project(settings: &Settings, bundles: &[Bundle]) -> crate::Result<Vec<PathBuf>> {
|
||||
let target_os = settings
|
||||
.target()
|
||||
.split('-')
|
||||
.nth(2)
|
||||
.unwrap_or(std::env::consts::OS)
|
||||
.replace("darwin", "macos");
|
||||
let target_os = settings.target_platform();
|
||||
|
||||
if target_os == "windows" {
|
||||
if matches!(target_os, TargetPlatform::Windows) {
|
||||
return bundle_update_windows(settings, bundles);
|
||||
}
|
||||
|
||||
@@ -193,7 +188,7 @@ fn bundle_update_windows(settings: &Settings, bundles: &[Bundle]) -> crate::Resu
|
||||
p.push(c);
|
||||
(p, b)
|
||||
});
|
||||
let archived_path = archived_path.with_extension(format!("{}.zip", bundle_name));
|
||||
let archived_path = archived_path.with_extension(format!("{bundle_name}.zip"));
|
||||
|
||||
log::info!(action = "Bundling"; "{}", display_path(&archived_path));
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ impl ResourceDirectory {
|
||||
directories.push_str(wix_string.as_str());
|
||||
}
|
||||
let wix_string = if self.name.is_empty() {
|
||||
format!("{}{}", files, directories)
|
||||
format!("{files}{directories}")
|
||||
} else {
|
||||
format!(
|
||||
r#"<Directory Id="I{id}" Name="{name}">{files}{directories}</Directory>"#,
|
||||
@@ -221,8 +221,7 @@ fn app_installer_output_path(
|
||||
Arch::AArch64 => "arm64",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"Unsupported architecture: {:?}",
|
||||
target
|
||||
"Unsupported architecture: {target:?}"
|
||||
)))
|
||||
}
|
||||
};
|
||||
@@ -352,8 +351,7 @@ fn run_candle(
|
||||
Arch::AArch64 => "arm64",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"unsupported architecture: {:?}",
|
||||
target
|
||||
"unsupported architecture: {target:?}"
|
||||
)))
|
||||
}
|
||||
};
|
||||
@@ -443,8 +441,7 @@ pub fn build_wix_app_installer(
|
||||
Arch::AArch64 => "arm64",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"unsupported architecture: {:?}",
|
||||
target
|
||||
"unsupported architecture: {target:?}"
|
||||
)))
|
||||
}
|
||||
};
|
||||
@@ -845,7 +842,7 @@ pub fn build_wix_app_installer(
|
||||
|
||||
let locale_contents = locale_contents.replace(
|
||||
"</WixLocalization>",
|
||||
&format!("{}</WixLocalization>", unset_locale_strings),
|
||||
&format!("{unset_locale_strings}</WixLocalization>"),
|
||||
);
|
||||
let locale_path = output_path.join("locale.wxl");
|
||||
{
|
||||
|
||||
@@ -618,7 +618,7 @@ Section Install
|
||||
!insertmacro NSIS_HOOK_PREINSTALL
|
||||
!endif
|
||||
|
||||
!insertmacro CheckIfAppIsRunning
|
||||
!insertmacro CheckIfAppIsRunning "${MAINBINARYNAME}.exe" "${PRODUCTNAME}"
|
||||
|
||||
; Copy main executable
|
||||
File "${MAINBINARYSRCPATH}"
|
||||
@@ -755,7 +755,7 @@ Section Uninstall
|
||||
!insertmacro NSIS_HOOK_PREUNINSTALL
|
||||
!endif
|
||||
|
||||
!insertmacro CheckIfAppIsRunning
|
||||
!insertmacro CheckIfAppIsRunning "${MAINBINARYNAME}.exe" "${PRODUCTNAME}"
|
||||
|
||||
; Delete the app directory and its content from disk
|
||||
; Copy main executable
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_ARABIC} "إضافة أو إزالة المكونات"
|
||||
LangString alreadyInstalled ${LANG_ARABIC} "التطبيق مثبت بالفعل"
|
||||
LangString alreadyInstalledLong ${LANG_ARABIC} "${PRODUCTNAME} ${VERSION} مثبت بالفعل. قم باختيار العملية التى تريدها ثم اضغط على التالى."
|
||||
LangString appRunning ${LANG_ARABIC} "${PRODUCTNAME} مازال يعمل! من فضلك، قم بإغلاق التطبيق أولاً ثم حاول مرة أخرى."
|
||||
LangString appRunningOkKill ${LANG_ARABIC} "${PRODUCTNAME} مازال يعمل!$\nاضغط OK لإغلاقه"
|
||||
LangString appRunning ${LANG_ARABIC} "{{product_name}} مازال يعمل! من فضلك، قم بإغلاق التطبيق أولاً ثم حاول مرة أخرى."
|
||||
LangString appRunningOkKill ${LANG_ARABIC} "{{product_name}} مازال يعمل!$\nاضغط OK لإغلاقه"
|
||||
LangString chooseMaintenanceOption ${LANG_ARABIC} "قم باختيار نوع الصيانة التى تريدها."
|
||||
LangString choowHowToInstall ${LANG_ARABIC} "قم باختيار طريقة تنصيب ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_ARABIC} "اضف اختصار على سطح المكتب"
|
||||
LangString dontUninstall ${LANG_ARABIC} "عدم إزالة"
|
||||
LangString dontUninstallDowngrade ${LANG_ARABIC} "عدم إزالة (التخفيض بدون إزالة غير مسموح لهذا المثبت)"
|
||||
LangString failedToKillApp ${LANG_ARABIC} "فشل فى غلف ${PRODUCTNAME}. من فضلك، قم بإغلاق التطبيق أولاً ثم حاول مرة أخرى."
|
||||
LangString failedToKillApp ${LANG_ARABIC} "فشل فى غلف {{product_name}}. من فضلك، قم بإغلاق التطبيق أولاً ثم حاول مرة أخرى."
|
||||
LangString installingWebview2 ${LANG_ARABIC} "تنصيب WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_ARABIC} "يوجد نسخة جديدة من ${PRODUCTNAME} مثبتة بالغعل! لا ينصح بتنصيب نسخة اقدم من النسخة الحالية. اذا مازلت ترغب فى تنصيب النسخة الأقدم، فينصح بإزالة النسخة الحالية أولاً. قم باختيار العملية التى تريدها ثم اضغط على التالى للاستمرار."
|
||||
LangString older ${LANG_ARABIC} "أقدم"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_BULGARIAN} "Добавяне/Преинсталиране на компоненти"
|
||||
LangString alreadyInstalled ${LANG_BULGARIAN} "Вече инсталиран"
|
||||
LangString alreadyInstalledLong ${LANG_BULGARIAN} "${PRODUCTNAME} ${VERSION} е вече е инсталиран. Изберете операцията, която искате да извършите и натиснете Напред, за да продължите."
|
||||
LangString appRunning ${LANG_BULGARIAN} "${PRODUCTNAME} е отворен! Моля, затворете го първо и опитайте отново."
|
||||
LangString appRunningOkKill ${LANG_BULGARIAN} "${PRODUCTNAME} е отворен!$\nНатиснете ОК, за да го затворите."
|
||||
LangString appRunning ${LANG_BULGARIAN} "{{product_name}} е отворен! Моля, затворете го първо и опитайте отново."
|
||||
LangString appRunningOkKill ${LANG_BULGARIAN} "{{product_name}} е отворен!$\nНатиснете ОК, за да го затворите."
|
||||
LangString chooseMaintenanceOption ${LANG_BULGARIAN} "Изберете опция за поддръжка."
|
||||
LangString choowHowToInstall ${LANG_BULGARIAN} "Изберете как искате да инсталирате ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_BULGARIAN} "Създайте пряк път на работния плот"
|
||||
LangString dontUninstall ${LANG_BULGARIAN} "Не деинсталирайте"
|
||||
LangString dontUninstallDowngrade ${LANG_BULGARIAN} "Не деинсталирайте (Понижаването без деинсталация е забранено за този инсталатор)"
|
||||
LangString failedToKillApp ${LANG_BULGARIAN} "Неуспешно прекратяване на ${PRODUCTNAME}. Моля, затворете го първо и опитайте отново."
|
||||
LangString failedToKillApp ${LANG_BULGARIAN} "Неуспешно прекратяване на {{product_name}}. Моля, затворете го първо и опитайте отново."
|
||||
LangString installingWebview2 ${LANG_BULGARIAN} "Инсталиране на WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_BULGARIAN} "Вече е инсталирана по-нова версия на ${PRODUCTNAME}! Не се препоръчва да инсталирате по-стара версия. Ако наистина желаете да инсталирате тази по-стара версия, по-добре е да деинсталирате текущата версия първо. Изберете операцията, която искате да извършите и натиснете Напред, за да продължите."
|
||||
LangString older ${LANG_BULGARIAN} "по-стара"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_DUTCH} "(Her)installeer componenten"
|
||||
LangString alreadyInstalled ${LANG_DUTCH} "Al geïnstalleerd"
|
||||
LangString alreadyInstalledLong ${LANG_DUTCH} "${PRODUCTNAME} ${VERSION} is al geïnstalleerd. Kies een van de volgende opties en klik op Volgende om door te gaan."
|
||||
LangString appRunning ${LANG_DUTCH} "${PRODUCTNAME} is geopend! Sluit het programma eerst en probeer het dan opnieuw."
|
||||
LangString appRunningOkKill ${LANG_DUTCH} "${PRODUCTNAME} is geopend!$\nKlik op OK om het te stoppen."
|
||||
LangString appRunning ${LANG_DUTCH} "{{product_name}} is geopend! Sluit het programma eerst en probeer het dan opnieuw."
|
||||
LangString appRunningOkKill ${LANG_DUTCH} "{{product_name}} is geopend!$\nKlik op OK om het te stoppen."
|
||||
LangString chooseMaintenanceOption ${LANG_DUTCH} "Kies de onderhoudsoptie die u wilt uitvoeren."
|
||||
LangString choowHowToInstall ${LANG_DUTCH} "Kies hoe u ${PRODUCTNAME} wilt installeren."
|
||||
LangString createDesktop ${LANG_DUTCH} "Maak een snelkoppeling aan op het bureaublad"
|
||||
LangString dontUninstall ${LANG_DUTCH} "Deïnstalleer niet"
|
||||
LangString dontUninstallDowngrade ${LANG_DUTCH} "Deïnstalleer niet (Downgraden zonder deïnstalleren is uitgeschakeld voor deze installer)"
|
||||
LangString failedToKillApp ${LANG_DUTCH} "Het is niet gelukt ${PRODUCTNAME} te stoppen. Sluit het eerst zelf en probeer het dan nog een keer"
|
||||
LangString failedToKillApp ${LANG_DUTCH} "Het is niet gelukt {{product_name}} te stoppen. Sluit het eerst zelf en probeer het dan nog een keer"
|
||||
LangString installingWebview2 ${LANG_DUTCH} "WebView2 wordt geïnstalleerd..."
|
||||
LangString newerVersionInstalled ${LANG_DUTCH} "Een nieuwere versie van ${PRODUCTNAME} is al geïnstalleerd! Het word niet aangeraden om een oudere versie te installeren. Als u echt deze oudere versie wilt installeren, kunt u beter de huidige versie eerst deïnstalleren. Kies een van de volgende opties en klik op Volgende om door te gaan."
|
||||
LangString older ${LANG_DUTCH} "oudere"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_ENGLISH} "Add/Reinstall components"
|
||||
LangString alreadyInstalled ${LANG_ENGLISH} "Already Installed"
|
||||
LangString alreadyInstalledLong ${LANG_ENGLISH} "${PRODUCTNAME} ${VERSION} is already installed. Select the operation you want to perform and click Next to continue."
|
||||
LangString appRunning ${LANG_ENGLISH} "${PRODUCTNAME} is running! Please close it first then try again."
|
||||
LangString appRunningOkKill ${LANG_ENGLISH} "${PRODUCTNAME} is running!$\nClick OK to kill it"
|
||||
LangString appRunning ${LANG_ENGLISH} "{{product_name}} is running! Please close it first then try again."
|
||||
LangString appRunningOkKill ${LANG_ENGLISH} "{{product_name}} is running!$\nClick OK to kill it"
|
||||
LangString chooseMaintenanceOption ${LANG_ENGLISH} "Choose the maintenance option to perform."
|
||||
LangString choowHowToInstall ${LANG_ENGLISH} "Choose how you want to install ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_ENGLISH} "Create desktop shortcut"
|
||||
LangString dontUninstall ${LANG_ENGLISH} "Do not uninstall"
|
||||
LangString dontUninstallDowngrade ${LANG_ENGLISH} "Do not uninstall (Downgrading without uninstall is disabled for this installer)"
|
||||
LangString failedToKillApp ${LANG_ENGLISH} "Failed to kill ${PRODUCTNAME}. Please close it first then try again"
|
||||
LangString failedToKillApp ${LANG_ENGLISH} "Failed to kill {{product_name}}. Please close it first then try again"
|
||||
LangString installingWebview2 ${LANG_ENGLISH} "Installing WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_ENGLISH} "A newer version of ${PRODUCTNAME} is already installed! It is not recommended that you install an older version. If you really want to install this older version, it's better to uninstall the current version first. Select the operation you want to perform and click Next to continue."
|
||||
LangString older ${LANG_ENGLISH} "older"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_FRENCH} "Ajouter/Réinstaller un composant."
|
||||
LangString alreadyInstalled ${LANG_FRENCH} "Déja installé."
|
||||
LangString alreadyInstalledLong ${LANG_FRENCH} "${PRODUCTNAME} ${VERSION} est déja installé. Sélectionnez l'opération que vous souhaitez effectuer, puis cliquez sur Suivant pour continuer."
|
||||
LangString appRunning ${LANG_FRENCH} "${PRODUCTNAME} est en cours d'exécution. Veuillez fermer l'application avant de réessayer."
|
||||
LangString appRunningOkKill ${LANG_FRENCH} "${PRODUCTNAME} est en cours d'exécution.$\nCliquez sur OK pour fermer l'application."
|
||||
LangString appRunning ${LANG_FRENCH} "{{product_name}} est en cours d'exécution. Veuillez fermer l'application avant de réessayer."
|
||||
LangString appRunningOkKill ${LANG_FRENCH} "{{product_name}} est en cours d'exécution.$\nCliquez sur OK pour fermer l'application."
|
||||
LangString chooseMaintenanceOption ${LANG_FRENCH} "Veuillez choisir l'option de maintenance à effectuer."
|
||||
LangString choowHowToInstall ${LANG_FRENCH} "Veuillez choisir l'emplacement d'installation de ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_FRENCH} "Créer un raccourci sur le bureau."
|
||||
LangString dontUninstall ${LANG_FRENCH} "Ne pas désinstaller"
|
||||
LangString dontUninstallDowngrade ${LANG_FRENCH} "Ne pas désinstaller (revenir à une ancienne version sans désinstallation est désactivé pour cet installateur)"
|
||||
LangString failedToKillApp ${LANG_FRENCH} "La fermeture de ${PRODUCTNAME} a échoué. Veuillez fermer l'application et réessayer."
|
||||
LangString failedToKillApp ${LANG_FRENCH} "La fermeture de {{product_name}} a échoué. Veuillez fermer l'application et réessayer."
|
||||
LangString installingWebview2 ${LANG_FRENCH} "Installation de WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_FRENCH} "Une version plus récente de ${PRODUCTNAME} est déja installée. Il n'est pas recommandé d'installer une ancienne version. Si vous souhaitez installer cette ancienne version, il est conseillé de désinstaller la version courante en premier. Veuillez sélectionner l'opération que vous souhaitez effectuer, puis cliquez sur Suivant pour continer."
|
||||
LangString older ${LANG_FRENCH} "ancien"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_GERMAN} "Komponenten hinzufügen/neu installieren"
|
||||
LangString alreadyInstalled ${LANG_GERMAN} "Bereits installiert"
|
||||
LangString alreadyInstalledLong ${LANG_GERMAN} "${PRODUCTNAME} ${VERSION} ist bereits installiert. Wählen Sie den gewünschten Vorgang aus und klicken Sie auf Weiter, um fortzufahren."
|
||||
LangString appRunning ${LANG_GERMAN} "${PRODUCTNAME} wird ausgeführt! Bitte schließen Sie es zuerst und versuchen Sie es dann erneut."
|
||||
LangString appRunningOkKill ${LANG_GERMAN} "${PRODUCTNAME} läuft! $\nKlicken Sie auf OK, um es zu beenden"
|
||||
LangString appRunning ${LANG_GERMAN} "{{product_name}} wird ausgeführt! Bitte schließen Sie es zuerst und versuchen Sie es dann erneut."
|
||||
LangString appRunningOkKill ${LANG_GERMAN} "{{product_name}} läuft! $\nKlicken Sie auf OK, um es zu beenden"
|
||||
LangString chooseMaintenanceOption ${LANG_GERMAN} "Wählen Sie die auszuführende Wartungsoption."
|
||||
LangString choowHowToInstall ${LANG_GERMAN} "Wählen Sie, wie Sie ${PRODUCTNAME} installieren möchten."
|
||||
LangString createDesktop ${LANG_GERMAN} "Desktop-Verknüpfung erstellen"
|
||||
LangString dontUninstall ${LANG_GERMAN} "Nicht deinstallieren"
|
||||
LangString dontUninstallDowngrade ${LANG_GERMAN} "Nicht deinstallieren (Downgrading ohne Deinstallation ist für dieses Installationsprogramm deaktiviert)"
|
||||
LangString failedToKillApp ${LANG_GERMAN} "Failed to kill ${PRODUCTNAME}. Bitte schließen Sie es zuerst und versuchen Sie es dann erneut"
|
||||
LangString failedToKillApp ${LANG_GERMAN} "Failed to kill {{product_name}}. Bitte schließen Sie es zuerst und versuchen Sie es dann erneut"
|
||||
LangString installingWebview2 ${LANG_GERMAN} "Installiere WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_GERMAN} "Eine neuere Version von ${PRODUCTNAME} ist bereits installiert! Es wird nicht empfohlen, eine ältere Version zu installieren. Wenn Sie diese ältere Version wirklich installieren wollen, ist es besser, die aktuelle Version zuerst zu deinstallieren. Wählen Sie den gewünschten Vorgang aus und klicken Sie auf Weiter, um fortzufahren."
|
||||
LangString älter ${LANG_GERMAN} "älter"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_HEBREW} "הוסף או התקן מחדש"
|
||||
LangString alreadyInstalled ${LANG_HEBREW} "כבר מותקן"
|
||||
LangString alreadyInstalledLong ${LANG_HEBREW} "${PRODUCTNAME} ${VERSION} כבר מותקן. בחר את הפעולה שברצונך לבצע ולחץ על הבא כדי להמשיך."
|
||||
LangString appRunning ${LANG_HEBREW} "${PRODUCTNAME} פועל! נא לסגור אותו ולנסות שוב."
|
||||
LangString appRunningOkKill ${LANG_HEBREW} "${PRODUCTNAME} פועל!$\nלחץ אישור כדי לסגור אותו."
|
||||
LangString appRunning ${LANG_HEBREW} "{{product_name}} פועל! נא לסגור אותו ולנסות שוב."
|
||||
LangString appRunningOkKill ${LANG_HEBREW} "{{product_name}} פועל!$\nלחץ אישור כדי לסגור אותו."
|
||||
LangString chooseMaintenanceOption ${LANG_HEBREW} "בחר את פעולת התחזוקה לביצוע"
|
||||
LangString choowHowToInstall ${LANG_HEBREW} "בחר איך תרצה להתקין את ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_HEBREW} "צור קיצור דרך בשולחן העבודה"
|
||||
LangString dontUninstall ${LANG_HEBREW} "אל תסיר"
|
||||
LangString dontUninstallDowngrade ${LANG_HEBREW} "אל תסיר (התקנת גרסה ישנה ללא הסרת הגרסה הנוכחית מושעית עבור התקנה זו)"
|
||||
LangString failedToKillApp ${LANG_HEBREW} "עצירת ${PRODUCTNAME} נכשלה. נא לסגור את היישום ולנסות שוב."
|
||||
LangString failedToKillApp ${LANG_HEBREW} "עצירת {{product_name}} נכשלה. נא לסגור את היישום ולנסות שוב."
|
||||
LangString installingWebview2 ${LANG_HEBREW} "מתקין את WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_HEBREW} "גרסה חדשה יותר של ${PRODUCTNAME} כבר מותקנת! לא מומלץ להתקין גרסה ישנה. אם בכל זאת תרצה להתקין את הגרסה הזו, מומלץ קודם להסיר את הגרסה הנוכחית. בחר את הפעולה שברצונך לבצע ולחץ הבא להמשך."
|
||||
LangString older ${LANG_HEBREW} "ישנה"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_ITALIAN} "Aggiungi/Reinstalla componenti"
|
||||
LangString alreadyInstalled ${LANG_ITALIAN} "Già installato"
|
||||
LangString alreadyInstalledLong ${LANG_ITALIAN} "${PRODUCTNAME} ${VERSION} è già installato. Seleziona l'operazione che vuoi eseguire e clicca Avanti per continuare."
|
||||
LangString appRunning ${LANG_ITALIAN} "${PRODUCTNAME} è in esecuzione! Chiudi e poi riprova."
|
||||
LangString appRunningOkKill ${LANG_ITALIAN} "${PRODUCTNAME} è in esecuzione!$\nSeleziona OK per chiuderlo"
|
||||
LangString appRunning ${LANG_ITALIAN} "{{product_name}} è in esecuzione! Chiudi e poi riprova."
|
||||
LangString appRunningOkKill ${LANG_ITALIAN} "{{product_name}} è in esecuzione!$\nSeleziona OK per chiuderlo"
|
||||
LangString chooseMaintenanceOption ${LANG_ITALIAN} "Seleziona l'operazione di manutenzione da eseguire."
|
||||
LangString choowHowToInstall ${LANG_ITALIAN} "Seleziona come vuoi installare ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_ITALIAN} "Crea scorciatoia sul Desktop"
|
||||
LangString dontUninstall ${LANG_ITALIAN} "Non disinstallare"
|
||||
LangString dontUninstallDowngrade ${LANG_ITALIAN} "Non disinstallare (Il downgrade senza la disinstallazione è disabilitato per questo installer)"
|
||||
LangString failedToKillApp ${LANG_ITALIAN} "Impossibile chiudere ${PRODUCTNAME}. Chiudi e poi riprova"
|
||||
LangString failedToKillApp ${LANG_ITALIAN} "Impossibile chiudere {{product_name}}. Chiudi e poi riprova"
|
||||
LangString installingWebview2 ${LANG_ITALIAN} "Installando WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_ITALIAN} "Una versione più recente di ${PRODUCTNAME} è già installata! Non è consigliato installare una versione più vecchia. Se vuoi comunque procedere, è meglio prima disinstallare la versione corrente. Seleziona l'operazione che vuoi eseguire e clicca Avanti per continuare."
|
||||
LangString older ${LANG_ITALIAN} "più vecchia"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_JAPANESE} "コンポーネントの追加・再インストール"
|
||||
LangString alreadyInstalled ${LANG_JAPANESE} "既にインストールされています"
|
||||
LangString alreadyInstalledLong ${LANG_JAPANESE} "${PRODUCTNAME} ${VERSION} は既にインストールされています。実行したい操作を選択し、「次へ」をクリックして続行します。"
|
||||
LangString appRunning ${LANG_JAPANESE} "${PRODUCTNAME} は動作中です。動作中のプログラムを終了し、もう一度やり直してください。"
|
||||
LangString appRunningOkKill ${LANG_JAPANESE} "${PRODUCTNAME} は動作中です。$\n「OK」を押すと動作中のプログラムを終了します。"
|
||||
LangString appRunning ${LANG_JAPANESE} "{{product_name}} は動作中です。動作中のプログラムを終了し、もう一度やり直してください。"
|
||||
LangString appRunningOkKill ${LANG_JAPANESE} "{{product_name}} は動作中です。$\n「OK」を押すと動作中のプログラムを終了します。"
|
||||
LangString chooseMaintenanceOption ${LANG_JAPANESE} "メンテナンスオプションを選択して実行します。"
|
||||
LangString choowHowToInstall ${LANG_JAPANESE} "${PRODUCTNAME} のインストール方法を選択してください。"
|
||||
LangString createDesktop ${LANG_JAPANESE} "デスクトップショートカットを作成する"
|
||||
LangString dontUninstall ${LANG_JAPANESE} "アンインストールしない"
|
||||
LangString dontUninstallDowngrade ${LANG_JAPANESE} "アンインストールしない (このインストーラーでは、アンインストールをせずにダウングレードすることはできません)"
|
||||
LangString failedToKillApp ${LANG_JAPANESE} "${PRODUCTNAME} の終了に失敗しました。動作中のプログラムを終了し、もう一度やり直してください。"
|
||||
LangString failedToKillApp ${LANG_JAPANESE} "{{product_name}} の終了に失敗しました。動作中のプログラムを終了し、もう一度やり直してください。"
|
||||
LangString installingWebview2 ${LANG_JAPANESE} "WebView2 をインストール中です..."
|
||||
LangString newerVersionInstalled ${LANG_JAPANESE} "既に新しいバージョンの ${PRODUCTNAME} がインストールされています。古いバージョンをインストールすることは推奨されません。どうしてもこの旧バージョンをインストールしたい場合は、先に現行バージョンをアンインストールしておく方がよいでしょう。実行したい操作を選択し、「次へ」をクリックして続行します。"
|
||||
LangString older ${LANG_JAPANESE} "旧"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_KOREAN} "컴포넌트 추가 및 재설치"
|
||||
LangString alreadyInstalled ${LANG_KOREAN} "이미 설치되어 있습니다"
|
||||
LangString alreadyInstalledLong ${LANG_KOREAN} "${PRODUCTNAME} ${VERSION}이(가) 이미 설치되어 있습니다. 수행하고자 하는 작업을 선택하고 '다음'을 클릭하여 계속합니다."
|
||||
LangString appRunning ${LANG_KOREAN} "${PRODUCTNAME}이(가) 실행 중입니다! 먼저 닫은 후 다시 시도하세요."
|
||||
LangString appRunningOkKill ${LANG_KOREAN} "${PRODUCTNAME}이(가) 실행 중입니다!$\n'OK'를 누르면 실행 중인 프로그램을 종료합니다."
|
||||
LangString appRunning ${LANG_KOREAN} "{{product_name}}이(가) 실행 중입니다! 먼저 닫은 후 다시 시도하세요."
|
||||
LangString appRunningOkKill ${LANG_KOREAN} "{{product_name}}이(가) 실행 중입니다!$\n'OK'를 누르면 실행 중인 프로그램을 종료합니다."
|
||||
LangString chooseMaintenanceOption ${LANG_KOREAN} "수행하려는 관리 옵션을 선택합니다."
|
||||
LangString choowHowToInstall ${LANG_KOREAN} "${PRODUCTNAME}의 설치 방법을 선택하세요.."
|
||||
LangString createDesktop ${LANG_KOREAN} "바탕화면 바로가기 만들기"
|
||||
LangString dontUninstall ${LANG_KOREAN} "제거하지 않기"
|
||||
LangString dontUninstallDowngrade ${LANG_KOREAN} "제거하지 않기 (이 설치 프로그램에서는 제거하지 않고 다운그레이드할 수 없습니다.)"
|
||||
LangString failedToKillApp ${LANG_KOREAN} "${PRODUCTNAME}을(를) 종료하지 못했습니다. 먼저 닫은 후 다시 시도하세요."
|
||||
LangString failedToKillApp ${LANG_KOREAN} "{{product_name}}을(를) 종료하지 못했습니다. 먼저 닫은 후 다시 시도하세요."
|
||||
LangString installingWebview2 ${LANG_KOREAN} "WebView2를 설치하는 중입니다..."
|
||||
LangString newerVersionInstalled ${LANG_KOREAN} "${PRODUCTNAME}의 최신 버전이 이미 설치되어 있습니다! 이전 버전을 설치하지 않는 것이 좋습니다. 이 이전 버전을 꼭 설치하려면 먼저 현재 버전을 제거하는 것이 좋습니다. 수행하려는 작업을 선택하고 '다음'을 클릭하여 계속합니다."
|
||||
LangString older ${LANG_KOREAN} "구"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_PERSIAN} "اضافه کردن/نصب مجدد کامپونتت"
|
||||
LangString alreadyInstalled ${LANG_PERSIAN} "قبلا نصب شده است"
|
||||
LangString alreadyInstalledLong ${LANG_PERSIAN} "${PRODUCTNAME} ${VERSION} قبلا نصب شده است. عملیات مدنظر را انتخاب کنید و بروی بعدی کلیک کنید."
|
||||
LangString appRunning ${LANG_PERSIAN} "${PRODUCTNAME} در حال اجر می باشد ! لطفا اول الان را ببندید و دوباره تلاش کنید"
|
||||
LangString appRunningOkKill ${LANG_PERSIAN} "${PRODUCTNAME} در حال اجرا می باشد!$\nبرای از بین بردن اوکی را انتخاب کنید"
|
||||
LangString appRunning ${LANG_PERSIAN} "{{product_name}} در حال اجر می باشد ! لطفا اول الان را ببندید و دوباره تلاش کنید"
|
||||
LangString appRunningOkKill ${LANG_PERSIAN} "{{product_name}} در حال اجرا می باشد!$\nبرای از بین بردن اوکی را انتخاب کنید"
|
||||
LangString chooseMaintenanceOption ${LANG_PERSIAN} "عملیات نگهداری مدنظر را برای اجرا انتخاب کنید"
|
||||
LangString choowHowToInstall ${LANG_PERSIAN} "نحوه نصب ${PRODUCTNAME} را انتخاب کنید"
|
||||
LangString createDesktop ${LANG_PERSIAN} "ایجاد میانبر دسکتاپ"
|
||||
LangString dontUninstall ${LANG_PERSIAN} "حذف نکنید"
|
||||
LangString dontUninstallDowngrade ${LANG_PERSIAN} "حذف نکنید (تنزل ورژن بدون حذف برای نصب کننده غیرفعال است)"
|
||||
LangString failedToKillApp ${LANG_PERSIAN} "${PRODUCTNAME} قابل کشته شدن نیست. اول آن را ببندید و دوباره تلاش کنید"
|
||||
LangString failedToKillApp ${LANG_PERSIAN} "{{product_name}} قابل کشته شدن نیست. اول آن را ببندید و دوباره تلاش کنید"
|
||||
LangString installingWebview2 ${LANG_PERSIAN} "در حال نصب WebView2 ..."
|
||||
LangString newerVersionInstalled ${LANG_PERSIAN} "ورژن جدید ${PRODUCTNAME} قبلا نصب شده است! نصب ورژن قدیمی تر به هیچ عنوان پیشنهاد نمی شود. اگر از این بابت اطمینان دارید , بهتر است ورژن فعلی را حذف کنید. عملیات مدنظر را انتخاب کنید و بروی بعدی کلیک کنید."
|
||||
LangString older ${LANG_PERSIAN} "قدیمی تر"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_PORTUGUESE} "Adicionar/Reinstalar componentes"
|
||||
LangString alreadyInstalled ${LANG_PORTUGUESE} "Já instalado"
|
||||
LangString alreadyInstalledLong ${LANG_PORTUGUESE} "${PRODUCTNAME} ${VERSION} já está instalado. Selecione a operação que deseja realizar e clique em Seguinte para continuar."
|
||||
LangString appRunning ${LANG_PORTUGUESE} "${PRODUCTNAME} está em execução! Por favor, feche-o primeiro e tente novamente."
|
||||
LangString appRunningOkKill ${LANG_PORTUGUESE} "${PRODUCTNAME} está em execução!$\nClique em OK para encerrá-lo."
|
||||
LangString appRunning ${LANG_PORTUGUESE} "{{product_name}} está em execução! Por favor, feche-o primeiro e tente novamente."
|
||||
LangString appRunningOkKill ${LANG_PORTUGUESE} "{{product_name}} está em execução!$\nClique em OK para encerrá-lo."
|
||||
LangString chooseMaintenanceOption ${LANG_PORTUGUESE} "Escolha a opção de manutenção a realizar."
|
||||
LangString choowHowToInstall ${LANG_PORTUGUESE} "Escolha como deseja instalar o ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_PORTUGUESE} "Criar atalho no ambiente de trabalho"
|
||||
LangString dontUninstall ${LANG_PORTUGUESE} "Não desinstalar"
|
||||
LangString dontUninstallDowngrade ${LANG_PORTUGUESE} "Não desinstalar (Instalar uma versão anterior sem desinstalar está desativado neste instalador)"
|
||||
LangString failedToKillApp ${LANG_PORTUGUESE} "Falha ao encerrar ${PRODUCTNAME}. Por favor, feche-o primeiro e tente novamente."
|
||||
LangString failedToKillApp ${LANG_PORTUGUESE} "Falha ao encerrar {{product_name}}. Por favor, feche-o primeiro e tente novamente."
|
||||
LangString installingWebview2 ${LANG_PORTUGUESE} "A instalar WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_PORTUGUESE} "Uma versão mais recente do ${PRODUCTNAME} já está instalada! Não é recomendada a instalação de uma versão mais antiga. Se realmente deseja instalar esta versão mais antiga, é melhor desinstalar a versão atual primeiro. Selecione a operação que deseja realizar e clique em Seguinte para continuar."
|
||||
LangString older ${LANG_PORTUGUESE} "mais antiga"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_PORTUGUESEBR} "Adicionar/Reinstalar componentes"
|
||||
LangString alreadyInstalled ${LANG_PORTUGUESEBR} "Já instalado"
|
||||
LangString alreadyInstalledLong ${LANG_PORTUGUESEBR} "${PRODUCTNAME} ${VERSION} já está instalado. Selecione a operação que deseja realizar e clique Próximo para continuar."
|
||||
LangString appRunning ${LANG_PORTUGUESEBR} "${PRODUCTNAME} está aberto! Por favor feche a janela dele e tente novamente."
|
||||
LangString appRunningOkKill ${LANG_PORTUGUESEBR} "${PRODUCTNAME} está aberto!$\nClique OK para fechar ele."
|
||||
LangString appRunning ${LANG_PORTUGUESEBR} "{{product_name}} está aberto! Por favor feche a janela dele e tente novamente."
|
||||
LangString appRunningOkKill ${LANG_PORTUGUESEBR} "{{product_name}} está aberto!$\nClique OK para fechar ele."
|
||||
LangString chooseMaintenanceOption ${LANG_PORTUGUESEBR} "Escolha a opção de manutenção a realizar."
|
||||
LangString choowHowToInstall ${LANG_PORTUGUESEBR} "Escolha como deseja instalar ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_PORTUGUESEBR} "Criar atalho na área de trabalho"
|
||||
LangString dontUninstall ${LANG_PORTUGUESEBR} "Não desinstalar"
|
||||
LangString dontUninstallDowngrade ${LANG_PORTUGUESEBR} "Não desinstalar (Instalar versão anterior sem desinstalar está desabilitado nesse instalador)"
|
||||
LangString failedToKillApp ${LANG_PORTUGUESEBR} "Falha ao fechar ${PRODUCTNAME}. Por favor feche a janela dele primeiro e tente novamente"
|
||||
LangString failedToKillApp ${LANG_PORTUGUESEBR} "Falha ao fechar {{product_name}}. Por favor feche a janela dele primeiro e tente novamente"
|
||||
LangString installingWebview2 ${LANG_PORTUGUESEBR} "Instalando WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_PORTUGUESEBR} "Uma nova versão do ${PRODUCTNAME} já está instalado! Não é recomendado instalar uma versão anterior. Se realmente deseja instalar essa versão antiga, é recomendado desinstalar a versão atual primeirl. Selecione a operação que deseja executare clique Próximo para continuar."
|
||||
LangString older ${LANG_PORTUGUESEBR} "mais antiga"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_RUSSIAN} "Добавить/Переустановить компоненты"
|
||||
LangString alreadyInstalled ${LANG_RUSSIAN} "Уже установлено"
|
||||
LangString alreadyInstalledLong ${LANG_RUSSIAN} "${PRODUCTNAME} ${VERSION} уже установлен. Выберите действие, которое вы хотите выполнить и нажмите Далее для продолжения."
|
||||
LangString appRunning ${LANG_RUSSIAN} "${PRODUCTNAME} запущен! Пожалуйста, закройте приложение и попробуйте еще раз."
|
||||
LangString appRunningOkKill ${LANG_RUSSIAN} "${PRODUCTNAME} запущен!$\nНажмите OK чтобы закрыть приложение"
|
||||
LangString appRunning ${LANG_RUSSIAN} "{{product_name}} запущен! Пожалуйста, закройте приложение и попробуйте еще раз."
|
||||
LangString appRunningOkKill ${LANG_RUSSIAN} "{{product_name}} запущен!$\nНажмите OK чтобы закрыть приложение"
|
||||
LangString chooseMaintenanceOption ${LANG_RUSSIAN} "Выберите действие, которое вы хотите выполнить."
|
||||
LangString choowHowToInstall ${LANG_RUSSIAN} "Выберите, как вы хотите установить ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_RUSSIAN} "Добавить ярлык на рабочий стол"
|
||||
LangString dontUninstall ${LANG_RUSSIAN} "Не удалять"
|
||||
LangString dontUninstallDowngrade ${LANG_RUSSIAN} "Не удалять (Установка более ранних версий без удаления невозможна)"
|
||||
LangString failedToKillApp ${LANG_RUSSIAN} "Не удалось закрыть ${PRODUCTNAME}. Пожалуйста, закройте приложение и попробуйте еще раз"
|
||||
LangString failedToKillApp ${LANG_RUSSIAN} "Не удалось закрыть {{product_name}}. Пожалуйста, закройте приложение и попробуйте еще раз"
|
||||
LangString installingWebview2 ${LANG_RUSSIAN} "Установка WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_RUSSIAN} "Более новая версия ${PRODUCTNAME} уже установлена! Не рекомендуется устанавливать более раннюю версию. Если вы действительно хотите установить эту версию, рекомендуется сначала удалить текущую. Выберите действие, которое вы хотите выполнить и нажмите Далее для продолжения."
|
||||
LangString older ${LANG_RUSSIAN} "Более ранняя"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_SIMPCHINESE} "添加/重新安装组件"
|
||||
LangString alreadyInstalled ${LANG_SIMPCHINESE} "已安装"
|
||||
LangString alreadyInstalledLong ${LANG_SIMPCHINESE} "${PRODUCTNAME} ${VERSION} 已经安装了。选择你想要执行的操作后点击下一步以继续。"
|
||||
LangString appRunning ${LANG_SIMPCHINESE} "${PRODUCTNAME} 正在运行!请关闭后再试。"
|
||||
LangString appRunningOkKill ${LANG_SIMPCHINESE} "${PRODUCTNAME} 正在运行!$\n点击确定以终止运行。"
|
||||
LangString appRunning ${LANG_SIMPCHINESE} "{{product_name}} 正在运行!请关闭后再试。"
|
||||
LangString appRunningOkKill ${LANG_SIMPCHINESE} "{{product_name}} 正在运行!$\n点击确定以终止运行。"
|
||||
LangString chooseMaintenanceOption ${LANG_SIMPCHINESE} "选择要执行的维护操作。"
|
||||
LangString choowHowToInstall ${LANG_SIMPCHINESE} "选择你想要安装 ${PRODUCTNAME} 的方式。"
|
||||
LangString createDesktop ${LANG_SIMPCHINESE} "创建桌面快捷方式"
|
||||
LangString dontUninstall ${LANG_SIMPCHINESE} "请勿卸载"
|
||||
LangString dontUninstallDowngrade ${LANG_SIMPCHINESE} "请勿卸载(此安装程序禁止未卸载就进行版本降级的操作)"
|
||||
LangString failedToKillApp ${LANG_SIMPCHINESE} "无法终止 ${PRODUCTNAME}。请关闭后再试。"
|
||||
LangString failedToKillApp ${LANG_SIMPCHINESE} "无法终止 {{product_name}}。请关闭后再试。"
|
||||
LangString installingWebview2 ${LANG_SIMPCHINESE} "正在安装 WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_SIMPCHINESE} "有一个更新版本的 ${PRODUCTNAME} 已经安装了!不推荐你安装旧的版本。如果你真的想要安装这个旧的版本,推荐先卸载当前版本。选择你想要执行的操作后点击下一步以继续。"
|
||||
LangString older ${LANG_SIMPCHINESE} "旧的"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_SPANISH} "Añadir o reinstalar componentes"
|
||||
LangString alreadyInstalled ${LANG_SPANISH} "Ya está instalado"
|
||||
LangString alreadyInstalledLong ${LANG_SPANISH} "${PRODUCTNAME} ${VERSION} ya está instalado. Seleccione la operación que desee realizar y pulse Siguiente para continuar."
|
||||
LangString appRunning ${LANG_SPANISH} "¡${PRODUCTNAME} está abierto! Por favor ciérrelo e intente de nuevo."
|
||||
LangString appRunningOkKill ${LANG_SPANISH} "¡${PRODUCTNAME} está abierto!$\nPulse Aceptar para cerrarlo."
|
||||
LangString appRunning ${LANG_SPANISH} "¡{{product_name}} está abierto! Por favor ciérrelo e intente de nuevo."
|
||||
LangString appRunningOkKill ${LANG_SPANISH} "¡{{product_name}} está abierto!$\nPulse Aceptar para cerrarlo."
|
||||
LangString chooseMaintenanceOption ${LANG_SPANISH} "Elija la operación de mantenimiento que desee realizar."
|
||||
LangString choowHowToInstall ${LANG_SPANISH} "Elija cómo desea instalar ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_SPANISH} "Crear acceso directo en el escritorio"
|
||||
LangString dontUninstall ${LANG_SPANISH} "No desinstalar"
|
||||
LangString dontUninstallDowngrade ${LANG_SPANISH} "No desinstalar (Disminuir la versión sin desinstalar está deshabilitado para este instalador)"
|
||||
LangString failedToKillApp ${LANG_SPANISH} "No se ha podido cerrar ${PRODUCTNAME}. Por favor ciérrelo e intente de nuevo."
|
||||
LangString failedToKillApp ${LANG_SPANISH} "No se ha podido cerrar {{product_name}}. Por favor ciérrelo e intente de nuevo."
|
||||
LangString installingWebview2 ${LANG_SPANISH} "Instalando WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_SPANISH} "Ya está instalada una versión más reciente de ${PRODUCTNAME}. No se recomienda que instale una versión anterior. Si realmente desea instalar esta versión anterior, es recomendable desinstalar la versión actual antes de continuar. Seleccione la operación que desee realizar y pulse Siguiente para continuar."
|
||||
LangString older ${LANG_SPANISH} "anterior"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_SPANISHINTERNATIONAL} "Añadir o reinstalar componentes"
|
||||
LangString alreadyInstalled ${LANG_SPANISHINTERNATIONAL} "Ya está instalado"
|
||||
LangString alreadyInstalledLong ${LANG_SPANISHINTERNATIONAL} "${PRODUCTNAME} ${VERSION} ya está instalado. Seleccione la operación que desee realizar y pulse Siguiente para continuar."
|
||||
LangString appRunning ${LANG_SPANISHINTERNATIONAL} "¡${PRODUCTNAME} está abierto! Por favor ciérrelo e intente de nuevo."
|
||||
LangString appRunningOkKill ${LANG_SPANISHINTERNATIONAL} "¡${PRODUCTNAME} está abierto!$\nPulse Aceptar para cerrarlo."
|
||||
LangString appRunning ${LANG_SPANISHINTERNATIONAL} "¡{{product_name}} está abierto! Por favor ciérrelo e intente de nuevo."
|
||||
LangString appRunningOkKill ${LANG_SPANISHINTERNATIONAL} "¡{{product_name}} está abierto!$\nPulse Aceptar para cerrarlo."
|
||||
LangString chooseMaintenanceOption ${LANG_SPANISHINTERNATIONAL} "Elija la operación de mantenimiento que desee realizar."
|
||||
LangString choowHowToInstall ${LANG_SPANISHINTERNATIONAL} "Elija cómo desea instalar ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_SPANISHINTERNATIONAL} "Crear acceso directo en el escritorio"
|
||||
LangString dontUninstall ${LANG_SPANISHINTERNATIONAL} "No desinstalar"
|
||||
LangString dontUninstallDowngrade ${LANG_SPANISHINTERNATIONAL} "No desinstalar (Disminuir la versión sin desinstalar está deshabilitado para este instalador)"
|
||||
LangString failedToKillApp ${LANG_SPANISHINTERNATIONAL} "No se ha podido cerrar ${PRODUCTNAME}. Por favor ciérrelo e intente de nuevo."
|
||||
LangString failedToKillApp ${LANG_SPANISHINTERNATIONAL} "No se ha podido cerrar {{product_name}}. Por favor ciérrelo e intente de nuevo."
|
||||
LangString installingWebview2 ${LANG_SPANISHINTERNATIONAL} "Instalando WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_SPANISHINTERNATIONAL} "Ya está instalada una versión más reciente de ${PRODUCTNAME}. No se recomienda que instale una versión anterior. Si realmente desea instalar esta versión anterior, es recomendable desinstalar la versión actual antes de continuar. Seleccione la operación que desee realizar y pulse Siguiente para continuar."
|
||||
LangString older ${LANG_SPANISHINTERNATIONAL} "anterior"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_SWEDISH} "Lägg till/Installera om komponenter"
|
||||
LangString alreadyInstalled ${LANG_SWEDISH}} "Redan installerad"
|
||||
LangString alreadyInstalledLong ${LANG_SWEDISH}} "${PRODUCTNAME} ${VERSION} är redan installerad. Välj åtgärd och klicka på Nästa för att fortsätta."
|
||||
LangString appRunning ${LANG_SWEDISH} "${PRODUCTNAME} körs! Stäng det först och försök igen."
|
||||
LangString appRunningOkKill ${LANG_SWEDISH} "${PRODUCTNAME} körs!$\nKlicka på OK för att avsluta det."
|
||||
LangString appRunning ${LANG_SWEDISH} "{{product_name}} körs! Stäng det först och försök igen."
|
||||
LangString appRunningOkKill ${LANG_SWEDISH} "{{product_name}} körs!$\nKlicka på OK för att avsluta det."
|
||||
LangString chooseMaintenanceOption ${LANG_SWEDISH} "Välj underhållsåtgärd."
|
||||
LangString choowHowToInstall ${LANG_SWEDISH} "Välj hur du vill installera ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_SWEDISH} "Skapa genväg på skrivbordet"
|
||||
LangString dontUninstall ${LANG_SWEDISH} "Avinstallera inte"
|
||||
LangString dontUninstallDowngrade ${LANG_SWEDISH} "Avinstallera inte (nedgradering utan avinstallation är inaktiverad för den här installationsprogrammet)"
|
||||
LangString failedToKillApp ${LANG_SWEDISH} "Kunde inte avsluta ${PRODUCTNAME}. Stäng det först och försök igen."
|
||||
LangString failedToKillApp ${LANG_SWEDISH} "Kunde inte avsluta {{product_name}}. Stäng det först och försök igen."
|
||||
LangString installingWebview2 ${LANG_SWEDISH} "Installerar WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_SWEDISH} "En nyare version av ${PRODUCTNAME} är redan installerad! Det rekommenderas inte att installera en äldre version. Om du verkligen vill installera denna äldre version är det bättre att avinstallera den nuvarande versionen först. Välj åtgärd och klicka på Nästa för att fortsätta."
|
||||
LangString older ${LANG_SWEDISH} "äldre"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_TRADCHINESE} "增加或重新安裝元件"
|
||||
LangString alreadyInstalled ${LANG_TRADCHINESE} "已安裝"
|
||||
LangString alreadyInstalledLong ${LANG_TRADCHINESE} "${PRODUCTNAME} ${VERSION} 已經安裝了。選擇你想要進行的操作並且點選下一步。"
|
||||
LangString appRunning ${LANG_TRADCHINESE} "${PRODUCTNAME} 正在執行中!請先關閉再進行嘗試。"
|
||||
LangString appRunningOkKill ${LANG_TRADCHINESE} "${PRODUCTNAME} 正在執行中!點選確定後終止。"
|
||||
LangString appRunning ${LANG_TRADCHINESE} "{{product_name}} 正在執行中!請先關閉再進行嘗試。"
|
||||
LangString appRunningOkKill ${LANG_TRADCHINESE} "{{product_name}} 正在執行中!點選確定後終止。"
|
||||
LangString chooseMaintenanceOption ${LANG_TRADCHINESE} "請選擇你要進行的維護選項。"
|
||||
LangString choowHowToInstall ${LANG_TRADCHINESE} "選擇你要如何安裝 ${PRODUCTNAME}。"
|
||||
LangString createDesktop ${LANG_TRADCHINESE} "建立桌面捷徑"
|
||||
LangString dontUninstall ${LANG_TRADCHINESE} "請勿解除安裝"
|
||||
LangString dontUninstallDowngrade ${LANG_TRADCHINESE} "請勿解除安裝(本安裝程式不允許未解除安裝就進行版本降低的操作)"
|
||||
LangString failedToKillApp ${LANG_TRADCHINESE} "無法終止 ${PRODUCTNAME}。請先關閉再進行嘗試。"
|
||||
LangString failedToKillApp ${LANG_TRADCHINESE} "無法終止 {{product_name}}。請先關閉再進行嘗試。"
|
||||
LangString installingWebview2 ${LANG_TRADCHINESE} "WebView2 安裝中..."
|
||||
LangString newerVersionInstalled ${LANG_TRADCHINESE} "已安裝更新版本的 ${PRODUCTNAME}!不建議安裝舊版。如果真的想要安裝舊版的話,最好先解除安裝現在的版本。選擇你想要進行的操作後再進行下一步。"
|
||||
LangString older ${LANG_TRADCHINESE} "舊版"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_TURKISH} "Bileşen Ekle/Yeniden Yükle"
|
||||
LangString alreadyInstalled ${LANG_TURKISH} "Daha Önceden Yüklenmiş"
|
||||
LangString alreadyInstalledLong ${LANG_TURKISH} "${PRODUCTNAME} ${VERSION} daha önceden yüklenmiş. Gerçekleştirmek istediğiniz işlemi seçin ve devam etmek için İleri'ye tıklayın."
|
||||
LangString appRunning ${LANG_TURKISH} "${PRODUCTNAME} çalışır durumda! Lütfen önce uygulamayı kapatın ve sonra tekrar deneyin."
|
||||
LangString appRunningOkKill ${LANG_TURKISH} "${PRODUCTNAME} çalışır durumda!$\nUygulamayı sonlandırmak için Tamam'a tıklayın."
|
||||
LangString appRunning ${LANG_TURKISH} "{{product_name}} çalışır durumda! Lütfen önce uygulamayı kapatın ve sonra tekrar deneyin."
|
||||
LangString appRunningOkKill ${LANG_TURKISH} "{{product_name}} çalışır durumda!$\nUygulamayı sonlandırmak için Tamam'a tıklayın."
|
||||
LangString chooseMaintenanceOption ${LANG_TURKISH} "Gerçekleştirmek istediğiniz bakım seçeneğini belirleyin."
|
||||
LangString choowHowToInstall ${LANG_TURKISH} "${PRODUCTNAME} uygulamasını nasıl yüklemek istediğinizi seçin."
|
||||
LangString createDesktop ${LANG_TURKISH} "Masaüstü kısayolu oluştur"
|
||||
LangString dontUninstall ${LANG_TURKISH} "Kaldırma işlemini gerçekleştirme"
|
||||
LangString dontUninstallDowngrade ${LANG_TURKISH} "Kaldırma işlemini gerçekleştirme (Kaldırma işlemi yapmadan sürüm düşürme bu yükleyici için devre dışı bırakılmıştır)"
|
||||
LangString failedToKillApp ${LANG_TURKISH} "${PRODUCTNAME} sonlandırılamadı. Lütfen önce kapatın sonra tekrar deneyin."
|
||||
LangString failedToKillApp ${LANG_TURKISH} "{{product_name}} sonlandırılamadı. Lütfen önce kapatın sonra tekrar deneyin."
|
||||
LangString installingWebview2 ${LANG_TURKISH} "WebView2 yükleniyor..."
|
||||
LangString newerVersionInstalled ${LANG_TURKISH} "${PRODUCTNAME} uygulamasının daha yeni bir sürümü zaten yüklü! Daha eski bir sürümü yüklemeniz önerilmez. Bu eski sürümü gerçekten yüklemek istiyorsanız, önce mevcut sürümü kaldırmanız daha uygundur. Gerçekleştirmek istediğiniz işlemi seçin ve devam etmek için İleri'ye tıklayın."
|
||||
LangString older ${LANG_TURKISH} "daha eski"
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
LangString addOrReinstall ${LANG_UKRAINIAN} "Додати/Перевстановити компоненти"
|
||||
LangString alreadyInstalled ${LANG_UKRAINIAN} "Вже встановлено"
|
||||
LangString alreadyInstalledLong ${LANG_UKRAINIAN} "${PRODUCTNAME} ${VERSION} вже встановлено. Виберіть дію, яку ви хочете виконати, і натисніть Далі, щоб продовжити."
|
||||
LangString appRunning ${LANG_UKRAINIAN} "${PRODUCTNAME} запущено! Будь ласка, спочатку закрийте його, а потім спробуйте ще раз."
|
||||
LangString appRunningOkKill ${LANG_UKRAINIAN} "${PRODUCTNAME} запущено!$\nНатисніть ОК, щоб примусово закрити його"
|
||||
LangString appRunning ${LANG_UKRAINIAN} "{{product_name}} запущено! Будь ласка, спочатку закрийте його, а потім спробуйте ще раз."
|
||||
LangString appRunningOkKill ${LANG_UKRAINIAN} "{{product_name}} запущено!$\nНатисніть ОК, щоб примусово закрити його"
|
||||
LangString chooseMaintenanceOption ${LANG_UKRAINIAN} "Виберіть дію, яку треба виконати."
|
||||
LangString choowHowToInstall ${LANG_UKRAINIAN} "Виберіть, як ви хочете встановити ${PRODUCTNAME}."
|
||||
LangString createDesktop ${LANG_UKRAINIAN} "Створити ярлик на робочому столі"
|
||||
LangString dontUninstall ${LANG_UKRAINIAN} "Не видаляти"
|
||||
LangString dontUninstallDowngrade ${LANG_UKRAINIAN} "Не видаляти (для цього встановлювача вимкнено зниження версії без видалення)"
|
||||
LangString failedToKillApp ${LANG_UKRAINIAN} "Не вдалося примусово закрити ${PRODUCTNAME}. Будь ласка, спочатку закрийте його, а потім спробуйте ще раз"
|
||||
LangString failedToKillApp ${LANG_UKRAINIAN} "Не вдалося примусово закрити {{product_name}}. Будь ласка, спочатку закрийте його, а потім спробуйте ще раз"
|
||||
LangString installingWebview2 ${LANG_UKRAINIAN} "Встановлення WebView2..."
|
||||
LangString newerVersionInstalled ${LANG_UKRAINIAN} "Новіша версія ${PRODUCTNAME} вже встановлена! Встановлювати старішу версію не рекомендується. Якщо ви дійсно хочете встановити цю версію, краще спочатку видаліть поточну. Виберіть дію, яку ви хочете виконати, і натисніть Далі, щоб продовжити."
|
||||
LangString older ${LANG_UKRAINIAN} "старішу"
|
||||
|
||||
@@ -39,8 +39,8 @@ const NSIS_URL: &str =
|
||||
#[cfg(target_os = "windows")]
|
||||
const NSIS_SHA1: &str = "057e83c7d82462ec394af76c87d06733605543d4";
|
||||
const NSIS_TAURI_UTILS_URL: &str =
|
||||
"https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.4.2/nsis_tauri_utils.dll";
|
||||
const NSIS_TAURI_UTILS_SHA1: &str = "6532DA4545864C6EC95F62F27F2199BFD668560B";
|
||||
"https://github.com/tauri-apps/nsis-tauri-utils/releases/download/nsis_tauri_utils-v0.5.1/nsis_tauri_utils.dll";
|
||||
const NSIS_TAURI_UTILS_SHA1: &str = "B053B2E5FDB97257954C8F935D80964F056520AE";
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
const NSIS_REQUIRED_FILES: &[&str] = &[
|
||||
@@ -177,8 +177,7 @@ fn build_nsis_app_installer(
|
||||
Arch::AArch64 => "arm64",
|
||||
target => {
|
||||
return Err(crate::Error::ArchError(format!(
|
||||
"unsupported architecture: {:?}",
|
||||
target
|
||||
"unsupported architecture: {target:?}"
|
||||
)))
|
||||
}
|
||||
};
|
||||
|
||||
@@ -19,43 +19,54 @@
|
||||
!macroend
|
||||
|
||||
; Checks whether app is running or not and prompts to kill it.
|
||||
!macro CheckIfAppIsRunning
|
||||
!macro CheckIfAppIsRunning executableName productName
|
||||
!define UniqueID ${__LINE__}
|
||||
|
||||
; Replace {{product_name}} placeholder in the messages with the passed product name
|
||||
nsis_tauri_utils::StrReplace "$(appRunning)" "{{product_name}}" "${productName}"
|
||||
Pop $R1
|
||||
nsis_tauri_utils::StrReplace "$(appRunningOkKill)" "{{product_name}}" "${productName}"
|
||||
Pop $R2
|
||||
nsis_tauri_utils::StrReplace "$(failedToKillApp)" "{{product_name}}" "${productName}"
|
||||
Pop $R3
|
||||
|
||||
!if "${INSTALLMODE}" == "currentUser"
|
||||
nsis_tauri_utils::FindProcessCurrentUser "${MAINBINARYNAME}.exe"
|
||||
nsis_tauri_utils::FindProcessCurrentUser "${executableName}"
|
||||
!else
|
||||
nsis_tauri_utils::FindProcess "${MAINBINARYNAME}.exe"
|
||||
nsis_tauri_utils::FindProcess "${executableName}"
|
||||
!endif
|
||||
Pop $R0
|
||||
${If} $R0 = 0
|
||||
IfSilent kill 0
|
||||
${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL "$(appRunningOkKill)" IDOK kill IDCANCEL cancel ${|}
|
||||
kill:
|
||||
IfSilent kill_${UniqueID} 0
|
||||
${IfThen} $PassiveMode != 1 ${|} MessageBox MB_OKCANCEL $R2 IDOK kill_${UniqueID} IDCANCEL cancel_${UniqueID} ${|}
|
||||
kill_${UniqueID}:
|
||||
!if "${INSTALLMODE}" == "currentUser"
|
||||
nsis_tauri_utils::KillProcessCurrentUser "${MAINBINARYNAME}.exe"
|
||||
nsis_tauri_utils::KillProcessCurrentUser "${executableName}"
|
||||
!else
|
||||
nsis_tauri_utils::KillProcess "${MAINBINARYNAME}.exe"
|
||||
nsis_tauri_utils::KillProcess "${executableName}"
|
||||
!endif
|
||||
Pop $R0
|
||||
Sleep 500
|
||||
${If} $R0 = 0
|
||||
Goto app_check_done
|
||||
Goto app_check_done_${UniqueID}
|
||||
${Else}
|
||||
IfSilent silent ui
|
||||
silent:
|
||||
IfSilent silent_${UniqueID} ui_${UniqueID}
|
||||
silent_${UniqueID}:
|
||||
System::Call 'kernel32::AttachConsole(i -1)i.r0'
|
||||
${If} $0 != 0
|
||||
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
|
||||
System::call 'kernel32::SetConsoleTextAttribute(i r0, i 0x0004)' ; set red color
|
||||
FileWrite $0 "$(appRunning)$\n"
|
||||
FileWrite $0 "$R1$\n"
|
||||
${EndIf}
|
||||
Abort
|
||||
ui:
|
||||
Abort "$(failedToKillApp)"
|
||||
ui_${UniqueID}:
|
||||
Abort $R3
|
||||
${EndIf}
|
||||
cancel:
|
||||
Abort "$(appRunning)"
|
||||
cancel_${UniqueID}:
|
||||
Abort $R1
|
||||
${EndIf}
|
||||
app_check_done:
|
||||
app_check_done_${UniqueID}:
|
||||
!undef UniqueID
|
||||
!macroend
|
||||
|
||||
; Sets AppUserModelId on a shortcut
|
||||
|
||||
@@ -1,5 +1,41 @@
|
||||
# Changelog
|
||||
|
||||
## \[2.6.2]
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`cbd962972`](https://www.github.com/tauri-apps/tauri/commit/cbd9629729ed6eb208ba2234d014c11c4e9f1c8c) ([#13730](https://www.github.com/tauri-apps/tauri/pull/13730) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Load `--config` arguments when running the Xcode and Android Studio build scripts.
|
||||
|
||||
## \[2.6.1]
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`4b7370e9e`](https://www.github.com/tauri-apps/tauri/commit/4b7370e9e0ba299361c8ad96c08882337e44f091) ([#13710](https://www.github.com/tauri-apps/tauri/pull/13710) by [@FabianLars](https://www.github.com/tauri-apps/tauri/../../FabianLars)) Fixed an issue in the plugin template (`tauri plugin init`) that prevented the js build command to fail.
|
||||
|
||||
## \[2.6.0]
|
||||
|
||||
### New Features
|
||||
|
||||
- [`414619c36`](https://www.github.com/tauri-apps/tauri/commit/414619c36e94e21939534dd72c0438b93da75546) ([#13536](https://www.github.com/tauri-apps/tauri/pull/13536) by [@Tunglies](https://www.github.com/tauri-apps/tauri/../../Tunglies)) Added support for the `bundleName` property in the macOS bundler configuration. This allows specifying the `CFBundleName` value for generated macOS bundles.
|
||||
- [`3242e1c94`](https://www.github.com/tauri-apps/tauri/commit/3242e1c946c441b58665ba5d612f3a3f1eafe0b6) ([#13659](https://www.github.com/tauri-apps/tauri/pull/13659) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Allow passing Cargo arguments to mobile dev and build commands.
|
||||
- [`d1ce9af62`](https://www.github.com/tauri-apps/tauri/commit/d1ce9af62881e3f7d86a495c9c40df5b7f9d1c04) ([#13660](https://www.github.com/tauri-apps/tauri/pull/13660) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Allow passing `--config` arguments to the `ios init` and `android init` commands to tweak the configuration used to initialize the mobile projects.
|
||||
- [`7322f0579`](https://www.github.com/tauri-apps/tauri/commit/7322f057923aaec88960ad5556776774b745762f) ([#13502](https://www.github.com/tauri-apps/tauri/pull/13502) by [@amrbashir](https://www.github.com/tauri-apps/tauri/../../amrbashir)) Allow using `CheckIfAppIsRunning` macro inside NSIS hooks, for example `!insertmacro CheckIfAppIsRunning "another-executable.exe" "Another Executable"`.
|
||||
- [`4a880ca69`](https://www.github.com/tauri-apps/tauri/commit/4a880ca697bab6d63a2a51ea94e1988cc8c4ea4a) ([#13658](https://www.github.com/tauri-apps/tauri/pull/13658) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Synchronize Tauri config productName changes with the iOS Xcode project.
|
||||
- [`8ee14a864`](https://www.github.com/tauri-apps/tauri/commit/8ee14a86480510c15823586cf28084e615cb7a9c) ([#13618](https://www.github.com/tauri-apps/tauri/pull/13618) by [@Sky-walkerX](https://www.github.com/tauri-apps/tauri/../../Sky-walkerX)) Warn the user that the app id shouldn't end in `.app` because it conflicts with the application bundle extension on macOS
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
- [`574a4d4d3`](https://www.github.com/tauri-apps/tauri/commit/574a4d4d36762b5b09dc3fcfcbcae3a0df0b6d89) ([#13426](https://www.github.com/tauri-apps/tauri/pull/13426) by [@Legend-Master](https://www.github.com/tauri-apps/tauri/../../Legend-Master)) Fix `dev`, `build` and `bundle` commands always take 2 seconds to start
|
||||
- [`35aa7e121`](https://www.github.com/tauri-apps/tauri/commit/35aa7e1218f34d0805e280e3ec32529d0cb0d733) ([#13294](https://www.github.com/tauri-apps/tauri/pull/13294) by [@kingsword09](https://www.github.com/tauri-apps/tauri/../../kingsword09)) fix: allow the target directory to be inside frontendDir as long as it is not the Rust target directory inside frontendDir.
|
||||
- [`ec6065fa4`](https://www.github.com/tauri-apps/tauri/commit/ec6065fa4a6427266ecfb0c0f62f008574bb7880) ([#13625](https://www.github.com/tauri-apps/tauri/pull/13625) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Fixes Android and iOS dev/build commands not working when the app identifier is being modified by the `--config` option.
|
||||
- [`5a5291d66`](https://www.github.com/tauri-apps/tauri/commit/5a5291d66cb8a955c9d4f8e975782646ac0cc6e7) ([#13483](https://www.github.com/tauri-apps/tauri/pull/13483) by [@lucasfernog](https://www.github.com/tauri-apps/tauri/../../lucasfernog)) Fix simulator build detection on Xcode.
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Upgraded to `tauri-bundler@2.5.0`
|
||||
- Upgraded to `tauri-utils@2.5.0`
|
||||
- [`9c16eefa3`](https://www.github.com/tauri-apps/tauri/commit/9c16eefa319b4697bac1d1019bbb5f93eca63173) ([#13629](https://www.github.com/tauri-apps/tauri/pull/13629) by [@sftse](https://www.github.com/tauri-apps/tauri/../../sftse)) Update html5ever to 0.29 and kuchikiki to version 0.8.8-speedreader.
|
||||
|
||||
## \[2.5.0]
|
||||
|
||||
### New Features
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tauri-cli"
|
||||
version = "2.5.0"
|
||||
version = "2.6.2"
|
||||
authors = ["Tauri Programme within The Commons Conservancy"]
|
||||
edition = "2021"
|
||||
rust-version = "1.77.2"
|
||||
@@ -47,7 +47,7 @@ sublime_fuzzy = "0.7"
|
||||
clap_complete = "4"
|
||||
clap = { version = "4", features = ["derive", "env"] }
|
||||
anyhow = "1"
|
||||
tauri-bundler = { version = "2.4.0", default-features = false, path = "../tauri-bundler" }
|
||||
tauri-bundler = { version = "2.5.0", default-features = false, path = "../tauri-bundler" }
|
||||
colored = "2"
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = { version = "1", features = ["preserve_order"] }
|
||||
@@ -55,20 +55,15 @@ json5 = "0.4"
|
||||
notify = "8"
|
||||
notify-debouncer-full = "0.5"
|
||||
shared_child = "1"
|
||||
duct = "0.13"
|
||||
duct = "1.0"
|
||||
toml_edit = { version = "0.22", features = ["serde"] }
|
||||
json-patch = "3"
|
||||
tauri-utils = { version = "2.4.0", path = "../tauri-utils", features = [
|
||||
"isolation",
|
||||
"schema",
|
||||
"config-json5",
|
||||
"config-toml",
|
||||
] }
|
||||
tauri-utils-v1 = { version = "1", package = "tauri-utils", features = [
|
||||
tauri-utils = { version = "2.5.0", path = "../tauri-utils", features = [
|
||||
"isolation",
|
||||
"schema",
|
||||
"config-json5",
|
||||
"config-toml",
|
||||
"html-manipulation",
|
||||
] }
|
||||
toml = "0.8"
|
||||
jsonschema = "0.30"
|
||||
@@ -90,9 +85,9 @@ log = { version = "0.4.21", features = ["kv", "kv_std"] }
|
||||
env_logger = "0.11"
|
||||
icns = { package = "tauri-icns", version = "0.1" }
|
||||
image = { version = "0.25", default-features = false, features = ["ico"] }
|
||||
axum = { version = "0.7", features = ["ws"] }
|
||||
html5ever = "0.26"
|
||||
kuchiki = { package = "kuchikiki", version = "0.8" }
|
||||
axum = { version = "0.8", features = ["ws"] }
|
||||
html5ever = "0.29"
|
||||
kuchiki = { package = "kuchikiki", version = "=0.8.8-speedreader" }
|
||||
tokio = { version = "1", features = ["macros", "sync"] }
|
||||
common-path = "1"
|
||||
serde-value = "0.7"
|
||||
@@ -114,15 +109,16 @@ elf = "0.7"
|
||||
memchr = "2"
|
||||
tempfile = "3"
|
||||
uuid = { version = "1", features = ["v5"] }
|
||||
rand = "0.8"
|
||||
rand = "0.9"
|
||||
|
||||
[dev-dependencies]
|
||||
insta = "1"
|
||||
pretty_assertions = "1"
|
||||
|
||||
[target."cfg(windows)".dependencies.windows-sys]
|
||||
version = "0.59"
|
||||
version = "0.60"
|
||||
features = [
|
||||
"Win32_Security",
|
||||
"Win32_Storage_FileSystem",
|
||||
"Win32_System_IO",
|
||||
"Win32_System_Console",
|
||||
|
||||
@@ -40,28 +40,3 @@ MIT or MIT/Apache 2.0 where applicable.
|
||||
Logo: CC-BY-NC-ND
|
||||
|
||||
- Original Tauri Logo Designs by [Daniel Thompson-Yvetot](https://github.com/nothingismagick) and [Guillaume Chau](https://github.com/akryum)
|
||||
|
||||
## Licensing Errata:
|
||||
|
||||
Because of publishing issues upstream, we soft-forked (and patched) both [`console`](https://github.com/mitsuhiko/console/blob/278de9dc2bf0fa28db69adee351072f668beec8f/Cargo.toml#L7) and [`dialoguer`](https://github.com/mitsuhiko/dialoguer/blob/2c3fe6b64641cfb57eb0e1d428274f63976ec150/Cargo.toml#L12) crates because of untenable issues surrounding expected use on Windows.
|
||||
|
||||
This soft fork was introduced to the Tauri Codebase [here](https://github.com/tauri-apps/tauri/pull/1610).
|
||||
|
||||
`console`
|
||||
|
||||
```
|
||||
license = "MIT"
|
||||
authors = [
|
||||
"Armin Ronacher <armin.ronacher@active-4.com>"
|
||||
]
|
||||
```
|
||||
|
||||
`dialoguer`
|
||||
|
||||
```
|
||||
license = "MIT"
|
||||
authors = [
|
||||
"Armin Ronacher <armin.ronacher@active-4.com>",
|
||||
"Pavan Kumar Sunkara <pavan.sss1991@gmail.com>"
|
||||
]
|
||||
```
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"$id": "https://schema.tauri.app/config/2.5.1",
|
||||
"$id": "https://schema.tauri.app/config/2.6.2",
|
||||
"title": "Config",
|
||||
"description": "The Tauri configuration object.\n It is read from a file where you can define your frontend assets,\n configure the bundler and define a tray icon.\n\n The configuration file is generated by the\n [`tauri init`](https://v2.tauri.app/reference/cli/#init) command that lives in\n your Tauri application source directory (src-tauri).\n\n Once generated, you may modify it at will to customize your Tauri application.\n\n ## File Formats\n\n By default, the configuration is defined as a JSON file named `tauri.conf.json`.\n\n Tauri also supports JSON5 and TOML files via the `config-json5` and `config-toml` Cargo features, respectively.\n The JSON5 file name must be either `tauri.conf.json` or `tauri.conf.json5`.\n The TOML file name is `Tauri.toml`.\n\n ## Platform-Specific Configuration\n\n In addition to the default configuration file, Tauri can\n read a platform-specific configuration from `tauri.linux.conf.json`,\n `tauri.windows.conf.json`, `tauri.macos.conf.json`, `tauri.android.conf.json` and `tauri.ios.conf.json`\n (or `Tauri.linux.toml`, `Tauri.windows.toml`, `Tauri.macos.toml`, `Tauri.android.toml` and `Tauri.ios.toml` if the `Tauri.toml` format is used),\n which gets merged with the main configuration object.\n\n ## Configuration Structure\n\n The configuration is composed of the following objects:\n\n - [`app`](#appconfig): The Tauri configuration\n - [`build`](#buildconfig): The build configuration\n - [`bundle`](#bundleconfig): The bundle configurations\n - [`plugins`](#pluginconfig): The plugins configuration\n\n Example tauri.config.json file:\n\n ```json\n {\n \"productName\": \"tauri-app\",\n \"version\": \"0.1.0\",\n \"build\": {\n \"beforeBuildCommand\": \"\",\n \"beforeDevCommand\": \"\",\n \"devUrl\": \"http://localhost:3000\",\n \"frontendDist\": \"../dist\"\n },\n \"app\": {\n \"security\": {\n \"csp\": null\n },\n \"windows\": [\n {\n \"fullscreen\": false,\n \"height\": 600,\n \"resizable\": true,\n \"title\": \"Tauri App\",\n \"width\": 800\n }\n ]\n },\n \"bundle\": {},\n \"plugins\": {}\n }\n ```",
|
||||
"type": "object",
|
||||
@@ -24,7 +24,7 @@
|
||||
"pattern": "^[^/\\:*?\"<>|]+$"
|
||||
},
|
||||
"mainBinaryName": {
|
||||
"description": "App main binary filename. Defaults to the name of your cargo crate.",
|
||||
"description": "Overrides app's main binary filename.\n\n By default, Tauri uses the output binary from `cargo`, by setting this, we will rename that binary in `tauri-cli`'s\n `tauri build` command, and target `tauri bundle` to it\n\n If possible, change the [`package name`] or set the [`name field`] instead,\n and if that's not enough and you're using nightly, consider using the [`different-binary-name`] feature instead\n\n Note: this config should not include the binary extension (e.g. `.exe`), we'll add that for you\n\n [`package name`]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-name-field\n [`name field`]: https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field\n [`different-binary-name`]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#different-binary-name",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
@@ -1346,7 +1346,7 @@
|
||||
]
|
||||
},
|
||||
"Capability": {
|
||||
"description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\n It controls application windows' and webviews' fine grained access\n to the Tauri core, application, or plugin commands.\n If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\n This can be done to create groups of windows, based on their required system access, which can reduce\n impact of frontend vulnerabilities in less privileged windows.\n Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`.\n A Window can have none, one, or multiple associated capabilities.\n\n ## Example\n\n ```json\n {\n \"identifier\": \"main-user-files-write\",\n \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\",\n \"windows\": [\n \"main\"\n ],\n \"permissions\": [\n \"core:default\",\n \"dialog:open\",\n {\n \"identifier\": \"fs:allow-write-text-file\",\n \"allow\": [{ \"path\": \"$HOME/test.txt\" }]\n },\n ],\n \"platforms\": [\"macOS\",\"windows\"]\n }\n ```",
|
||||
"description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\n It controls application windows' and webviews' fine grained access\n to the Tauri core, application, or plugin commands.\n If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\n This can be done to create groups of windows, based on their required system access, which can reduce\n impact of frontend vulnerabilities in less privileged windows.\n Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`.\n A Window can have none, one, or multiple associated capabilities.\n\n ## Example\n\n ```json\n {\n \"identifier\": \"main-user-files-write\",\n \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\",\n \"windows\": [\n \"main\"\n ],\n \"permissions\": [\n \"core:default\",\n \"dialog:open\",\n {\n \"identifier\": \"fs:allow-write-text-file\",\n \"allow\": [{ \"path\": \"$HOME/test.txt\" }]\n },\n ],\n \"platforms\": [\"macOS\",\"windows\"]\n }\n ```",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"identifier",
|
||||
@@ -1358,7 +1358,7 @@
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"description": "Description of what the capability is intended to allow on associated windows.\n\n It should contain a description of what the grouped permissions should allow.\n\n ## Example\n\n This capability allows the `main` window access to `filesystem` write related\n commands and `dialog` commands to enable programatic access to files selected by the user.",
|
||||
"description": "Description of what the capability is intended to allow on associated windows.\n\n It should contain a description of what the grouped permissions should allow.\n\n ## Example\n\n This capability allows the `main` window access to `filesystem` write related\n commands and `dialog` commands to enable programmatic access to files selected by the user.",
|
||||
"default": "",
|
||||
"type": "string"
|
||||
},
|
||||
@@ -1873,7 +1873,7 @@
|
||||
}
|
||||
},
|
||||
"removeUnusedCommands": {
|
||||
"description": "Try to remove unused commands registered from plugins base on the ACL list during `tauri build`,\n the way it works is that tauri-cli will read this and set the environment variables for the build script and macros,\n and they'll try to get all the allowed commands and remove the rest\n\n Note:\n - This won't be accounting for dynamically added ACLs so make sure to check it when using this\n - This feature requires tauri-plugin 2.1 and tauri 2.4",
|
||||
"description": "Try to remove unused commands registered from plugins base on the ACL list during `tauri build`,\n the way it works is that tauri-cli will read this and set the environment variables for the build script and macros,\n and they'll try to get all the allowed commands and remove the rest\n\n Note:\n - This won't be accounting for dynamically added ACLs when you use features from the `dynamic-acl` (currently enabled by default) feature flag, so make sure to check it when using this\n - This feature requires tauri-plugin 2.1 and tauri 2.4",
|
||||
"default": false,
|
||||
"type": "boolean"
|
||||
}
|
||||
@@ -2269,7 +2269,7 @@
|
||||
"description": "Updater type",
|
||||
"anyOf": [
|
||||
{
|
||||
"description": "Generates lagacy zipped v1 compatible updaters",
|
||||
"description": "Generates legacy zipped v1 compatible updaters",
|
||||
"allOf": [
|
||||
{
|
||||
"$ref": "#/definitions/V1Compatible"
|
||||
@@ -2283,10 +2283,10 @@
|
||||
]
|
||||
},
|
||||
"V1Compatible": {
|
||||
"description": "Generates lagacy zipped v1 compatible updaters",
|
||||
"description": "Generates legacy zipped v1 compatible updaters",
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "Generates lagacy zipped v1 compatible updaters",
|
||||
"description": "Generates legacy zipped v1 compatible updaters",
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"v1Compatible"
|
||||
@@ -3413,6 +3413,13 @@
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"bundleName": {
|
||||
"description": "The name of the builder that built the bundle.\n\n Translates to the bundle's CFBundleName property.\n\n If not set, defaults to the package's product name.",
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"minimumSystemVersion": {
|
||||
"description": "A version string indicating the minimum macOS X version that the bundled application supports. Defaults to `10.13`.\n\n Setting it to `null` completely removes the `LSMinimumSystemVersion` field on the bundle's `Info.plist`\n and the `MACOSX_DEPLOYMENT_TARGET` environment variable.\n\n An empty string is considered an invalid value so the default value is used.",
|
||||
"default": "10.13",
|
||||
@@ -3436,7 +3443,7 @@
|
||||
]
|
||||
},
|
||||
"hardenedRuntime": {
|
||||
"description": "Whether the codesign should enable [hardened runtime] (for executables) or not.\n\n [hardened runtime]: <https://developer.apple.com/documentation/security/hardened_runtime>",
|
||||
"description": "Whether the codesign should enable [hardened runtime](https://developer.apple.com/documentation/security/hardened_runtime) (for executables) or not.",
|
||||
"default": true,
|
||||
"type": "boolean"
|
||||
},
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"cli.js": {
|
||||
"version": "2.5.0",
|
||||
"version": "2.6.2",
|
||||
"node": ">= 10.0.0"
|
||||
},
|
||||
"tauri": "2.5.1",
|
||||
"tauri-build": "2.2.0",
|
||||
"tauri-plugin": "2.2.0"
|
||||
"tauri": "2.6.2",
|
||||
"tauri-build": "2.3.0",
|
||||
"tauri-plugin": "2.3.0"
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ pub fn command(options: Options) -> Result<()> {
|
||||
PermissionEntry::PermissionRef(
|
||||
p.clone()
|
||||
.try_into()
|
||||
.unwrap_or_else(|_| panic!("invalid permission {}", p)),
|
||||
.unwrap_or_else(|_| panic!("invalid permission {p}")),
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
|
||||
@@ -14,7 +14,7 @@ use crate::{
|
||||
};
|
||||
use anyhow::Context;
|
||||
use clap::{ArgAction, Parser};
|
||||
use std::{env::set_current_dir, fs};
|
||||
use std::env::set_current_dir;
|
||||
use tauri_utils::platform::Target;
|
||||
|
||||
#[derive(Debug, Clone, Parser)]
|
||||
@@ -150,6 +150,14 @@ pub fn setup(
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
if config_.identifier.ends_with(".app") {
|
||||
log::warn!(
|
||||
"The bundle identifier \"{}\" set in `{} identifier` ends with `.app`. This is not recommended because it conflicts with the application bundle extension on macOS.",
|
||||
config_.identifier,
|
||||
bundle_identifier_source
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(before_build) = config_.build.before_build_command.clone() {
|
||||
helpers::run_hook("beforeBuildCommand", before_build, interface, options.debug)?;
|
||||
}
|
||||
@@ -174,9 +182,9 @@ pub fn setup(
|
||||
|
||||
// Issue #13287 - Allow the use of target dir inside frontendDist/distDir
|
||||
// https://github.com/tauri-apps/tauri/issues/13287
|
||||
let target_path = fs::canonicalize(get_cargo_target_dir(&options.args)?)?;
|
||||
let target_path = get_cargo_target_dir(&options.args)?;
|
||||
let mut out_folders = Vec::new();
|
||||
if let Ok(web_asset_canonical) = web_asset_path.canonicalize() {
|
||||
if let Ok(web_asset_canonical) = dunce::canonicalize(web_asset_path) {
|
||||
if let Ok(relative_path) = target_path.strip_prefix(&web_asset_canonical) {
|
||||
let relative_str = relative_path.to_string_lossy();
|
||||
if !relative_str.is_empty() {
|
||||
|
||||
@@ -116,7 +116,7 @@ async fn ws_handler(ws: WebSocketUpgrade, state: State<ServerState>) -> Response
|
||||
_ = ws.recv() => return,
|
||||
fs_reload_event = rx.recv() => fs_reload_event.is_ok(),
|
||||
} {
|
||||
let msg = ws::Message::Text(r#"{"reload": true}"#.to_owned());
|
||||
let msg = ws::Message::Text(r#"{"reload": true}"#.into());
|
||||
if ws.send(msg).await.is_err() {
|
||||
break;
|
||||
}
|
||||
@@ -138,7 +138,9 @@ fn inject_address(html_bytes: Vec<u8>, address: &SocketAddr) -> Vec<u8> {
|
||||
}
|
||||
}
|
||||
|
||||
let mut document = kuchiki::parse_html().one(String::from_utf8_lossy(&html_bytes).into_owned());
|
||||
let mut document = kuchiki::parse_html()
|
||||
.one(String::from_utf8_lossy(&html_bytes).into_owned())
|
||||
.document_node;
|
||||
with_html_head(&mut document, |head| {
|
||||
let script = RELOAD_SCRIPT.replace("{{reload_url}}", &format!("ws://{address}/__tauri_cli"));
|
||||
let script_el = NodeRef::new_element(QualName::new(None, ns!(html), "script".into()), None);
|
||||
|
||||
@@ -22,6 +22,8 @@ pub const MERGE_CONFIG_EXTENSION_NAME: &str = "--config";
|
||||
pub struct ConfigMetadata {
|
||||
/// The current target.
|
||||
target: Target,
|
||||
|
||||
original_identifier: Option<String>,
|
||||
/// The actual configuration, merged with any extension.
|
||||
inner: Config,
|
||||
/// The config extensions (platform-specific config files or the config CLI argument).
|
||||
@@ -39,15 +41,17 @@ impl std::ops::Deref for ConfigMetadata {
|
||||
}
|
||||
|
||||
impl ConfigMetadata {
|
||||
/// The original bundle identifier from the config file.
|
||||
/// This does not take any extensions into account.
|
||||
pub fn original_identifier(&self) -> Option<&str> {
|
||||
self.original_identifier.as_deref()
|
||||
}
|
||||
|
||||
/// Checks which config is overwriting the bundle identifier.
|
||||
pub fn find_bundle_identifier_overwriter(&self) -> Option<String> {
|
||||
for (ext, config) in &self.extensions {
|
||||
if let Some(identifier) = config
|
||||
.as_object()
|
||||
.and_then(|config| config.get("tauri"))
|
||||
.and_then(|tauri_config| tauri_config.as_object())
|
||||
.and_then(|tauri_config| tauri_config.get("bundle"))
|
||||
.and_then(|bundle_config| bundle_config.as_object())
|
||||
.and_then(|bundle_config| bundle_config.get("identifier"))
|
||||
.and_then(|id| id.as_str())
|
||||
{
|
||||
@@ -153,6 +157,12 @@ fn get_internal(
|
||||
let config_file_name = config_path.file_name().unwrap().to_string_lossy();
|
||||
let mut extensions = HashMap::new();
|
||||
|
||||
let original_identifier = config
|
||||
.as_object()
|
||||
.and_then(|config| config.get("identifier"))
|
||||
.and_then(|id| id.as_str())
|
||||
.map(ToString::to_string);
|
||||
|
||||
if let Some((platform_config, config_path)) =
|
||||
tauri_utils::config::parse::read_platform(target, tauri_dir)?
|
||||
{
|
||||
@@ -220,6 +230,7 @@ fn get_internal(
|
||||
|
||||
*config_handle().lock().unwrap() = Some(ConfigMetadata {
|
||||
target,
|
||||
original_identifier,
|
||||
inner: config,
|
||||
extensions,
|
||||
});
|
||||
|
||||
@@ -97,7 +97,7 @@ pub fn run_hook(
|
||||
.current_dir(cwd)
|
||||
.envs(env)
|
||||
.piped()
|
||||
.with_context(|| format!("failed to run `{}` with `cmd /C`", script))?;
|
||||
.with_context(|| format!("failed to run `{script}` with `cmd /C`"))?;
|
||||
#[cfg(not(target_os = "windows"))]
|
||||
let status = Command::new("sh")
|
||||
.arg("-c")
|
||||
|
||||
@@ -60,6 +60,7 @@ pub struct Options {
|
||||
ios_color: String,
|
||||
}
|
||||
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
enum Source {
|
||||
Svg(resvg::usvg::Tree),
|
||||
DynamicImage(DynamicImage),
|
||||
|
||||
@@ -225,7 +225,7 @@ pub fn items() -> Vec<SectionItem> {
|
||||
);
|
||||
webview2_version()
|
||||
.map(|v| {
|
||||
v.map(|v| (format!("WebView2: {}", v), Status::Success))
|
||||
v.map(|v| (format!("WebView2: {v}"), Status::Success))
|
||||
.unwrap_or_else(|| (error.clone(), Status::Error))
|
||||
})
|
||||
.unwrap_or_else(|_| (error, Status::Error)).into()
|
||||
|
||||
@@ -195,23 +195,34 @@ pub fn command(mut options: Options) -> Result<()> {
|
||||
template_target_path
|
||||
);
|
||||
} else {
|
||||
let (tauri_dep, tauri_build_dep) = if let Some(tauri_path) = &options.tauri_path {
|
||||
(
|
||||
format!(
|
||||
r#"{{ path = {:?} }}"#,
|
||||
resolve_tauri_path(tauri_path, "crates/tauri")
|
||||
),
|
||||
format!(
|
||||
"{{ path = {:?} }}",
|
||||
resolve_tauri_path(tauri_path, "crates/tauri-build")
|
||||
),
|
||||
)
|
||||
} else {
|
||||
(
|
||||
format!(r#"{{ version = "{}" }}"#, metadata.tauri),
|
||||
format!(r#"{{ version = "{}" }}"#, metadata.tauri_build),
|
||||
)
|
||||
};
|
||||
let (tauri_dep, tauri_build_dep, tauri_utils_dep, tauri_plugin_dep) =
|
||||
if let Some(tauri_path) = &options.tauri_path {
|
||||
(
|
||||
format!(
|
||||
r#"{{ path = {:?} }}"#,
|
||||
resolve_tauri_path(tauri_path, "crates/tauri")
|
||||
),
|
||||
format!(
|
||||
"{{ path = {:?} }}",
|
||||
resolve_tauri_path(tauri_path, "crates/tauri-build")
|
||||
),
|
||||
format!(
|
||||
"{{ path = {:?} }}",
|
||||
resolve_tauri_path(tauri_path, "crates/tauri-utils")
|
||||
),
|
||||
format!(
|
||||
"{{ path = {:?} }}",
|
||||
resolve_tauri_path(tauri_path, "crates/tauri-plugin")
|
||||
),
|
||||
)
|
||||
} else {
|
||||
(
|
||||
format!(r#"{{ version = "{}" }}"#, metadata.tauri),
|
||||
format!(r#"{{ version = "{}" }}"#, metadata.tauri_build),
|
||||
r#"{{ version = "2" }}"#.to_string(),
|
||||
r#"{{ version = "2" }}"#.to_string(),
|
||||
)
|
||||
};
|
||||
|
||||
let _ = remove_dir_all(&template_target_path);
|
||||
let mut handlebars = Handlebars::new();
|
||||
@@ -223,6 +234,8 @@ pub fn command(mut options: Options) -> Result<()> {
|
||||
data.insert("patch_tauri_dep", to_json(true));
|
||||
}
|
||||
data.insert("tauri_build_dep", to_json(tauri_build_dep));
|
||||
data.insert("tauri_utils_dep", to_json(tauri_utils_dep));
|
||||
data.insert("tauri_plugin_dep", to_json(tauri_plugin_dep));
|
||||
data.insert(
|
||||
"frontend_dist",
|
||||
to_json(options.frontend_dist.as_deref().unwrap_or("../dist")),
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
ffi::OsStr,
|
||||
fs::{File, FileType},
|
||||
io::{BufRead, Read, Write},
|
||||
fs::FileType,
|
||||
io::{BufRead, Write},
|
||||
path::{Path, PathBuf},
|
||||
process::Command,
|
||||
str::FromStr,
|
||||
sync::{mpsc::sync_channel, Arc, Mutex},
|
||||
time::{Duration, Instant},
|
||||
time::Duration,
|
||||
};
|
||||
|
||||
use anyhow::Context;
|
||||
@@ -35,7 +35,7 @@ use crate::{
|
||||
},
|
||||
ConfigValue,
|
||||
};
|
||||
use tauri_utils::{display_path, platform::Target};
|
||||
use tauri_utils::{display_path, platform::Target as TargetPlatform};
|
||||
|
||||
mod cargo_config;
|
||||
mod desktop;
|
||||
@@ -126,22 +126,16 @@ impl Interface for Rust {
|
||||
let manifest = {
|
||||
let (tx, rx) = sync_channel(1);
|
||||
let mut watcher = new_debouncer(Duration::from_secs(1), None, move |r| {
|
||||
if let Ok(events) = r {
|
||||
let _ = tx.send(events);
|
||||
if let Ok(_events) = r {
|
||||
let _ = tx.send(());
|
||||
}
|
||||
})
|
||||
.unwrap();
|
||||
watcher.watch(tauri_dir().join("Cargo.toml"), RecursiveMode::Recursive)?;
|
||||
let (manifest, _modified) = rewrite_manifest(config)?;
|
||||
let now = Instant::now();
|
||||
let timeout = Duration::from_secs(2);
|
||||
loop {
|
||||
if now.elapsed() >= timeout {
|
||||
break;
|
||||
}
|
||||
if rx.try_recv().is_ok() {
|
||||
break;
|
||||
}
|
||||
watcher.watch(tauri_dir().join("Cargo.toml"), RecursiveMode::NonRecursive)?;
|
||||
let (manifest, modified) = rewrite_manifest(config)?;
|
||||
if modified {
|
||||
// Wait for the modified event so we don't trigger a re-build later on
|
||||
let _ = rx.recv_timeout(Duration::from_secs(2));
|
||||
}
|
||||
manifest
|
||||
};
|
||||
@@ -409,12 +403,10 @@ fn dev_options(
|
||||
|
||||
// Copied from https://github.com/rust-lang/cargo/blob/69255bb10de7f74511b5cef900a9d102247b6029/src/cargo/core/workspace.rs#L665
|
||||
fn expand_member_path(path: &Path) -> crate::Result<Vec<PathBuf>> {
|
||||
let Some(path) = path.to_str() else {
|
||||
return Err(anyhow::anyhow!("path is not UTF-8 compatible"));
|
||||
};
|
||||
let res = glob(path).with_context(|| format!("could not parse pattern `{}`", &path))?;
|
||||
let path = path.to_str().context("path is not UTF-8 compatible")?;
|
||||
let res = glob(path).with_context(|| format!("could not parse pattern `{path}`"))?;
|
||||
let res = res
|
||||
.map(|p| p.with_context(|| format!("unable to match path to pattern `{}`", &path)))
|
||||
.map(|p| p.with_context(|| format!("unable to match path to pattern `{path}`")))
|
||||
.collect::<Result<Vec<_>, _>>()?;
|
||||
Ok(res)
|
||||
}
|
||||
@@ -537,7 +529,7 @@ impl Rust {
|
||||
|
||||
if let Some(event_path) = event.paths.first() {
|
||||
if !ignore_matcher.is_ignore(event_path, event_path.is_dir()) {
|
||||
if is_configuration_file(self.app_settings.target, event_path) {
|
||||
if is_configuration_file(self.app_settings.target_platform, event_path) {
|
||||
if let Ok(config) = reload_config(merge_configs) {
|
||||
let (manifest, modified) =
|
||||
rewrite_manifest(config.lock().unwrap().as_ref().unwrap())?;
|
||||
@@ -614,8 +606,7 @@ impl<T> MaybeWorkspace<T> {
|
||||
))
|
||||
}
|
||||
MaybeWorkspace::Workspace(TomlWorkspaceField { workspace: false }) => Err(anyhow::anyhow!(
|
||||
"`workspace=false` is unsupported for `package.{}`",
|
||||
label,
|
||||
"`workspace=false` is unsupported for `package.{label}`"
|
||||
)),
|
||||
}
|
||||
}
|
||||
@@ -652,9 +643,18 @@ struct WorkspacePackageSettings {
|
||||
#[derive(Clone, Debug, Deserialize)]
|
||||
struct BinarySettings {
|
||||
name: String,
|
||||
/// This is from nightly: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#different-binary-name
|
||||
filename: Option<String>,
|
||||
path: Option<String>,
|
||||
}
|
||||
|
||||
impl BinarySettings {
|
||||
/// The file name without the binary extension (e.g. `.exe`)
|
||||
pub fn file_name(&self) -> &str {
|
||||
self.filename.as_ref().unwrap_or(&self.name)
|
||||
}
|
||||
}
|
||||
|
||||
/// The package settings.
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(rename_all = "kebab-case")]
|
||||
@@ -694,12 +694,9 @@ impl CargoSettings {
|
||||
/// Try to load a set of CargoSettings from a "Cargo.toml" file in the specified directory.
|
||||
fn load(dir: &Path) -> crate::Result<Self> {
|
||||
let toml_path = dir.join("Cargo.toml");
|
||||
let mut toml_str = String::new();
|
||||
let mut toml_file = File::open(toml_path).with_context(|| "failed to open Cargo.toml")?;
|
||||
toml_file
|
||||
.read_to_string(&mut toml_str)
|
||||
.with_context(|| "failed to read Cargo.toml")?;
|
||||
toml::from_str(&toml_str).with_context(|| "failed to parse Cargo.toml")
|
||||
let toml_str = std::fs::read_to_string(&toml_path)
|
||||
.with_context(|| format!("Failed to read {}", toml_path.display()))?;
|
||||
toml::from_str(&toml_str).with_context(|| format!("Failed to parse {}", toml_path.display()))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -711,7 +708,7 @@ pub struct RustAppSettings {
|
||||
package_settings: PackageSettings,
|
||||
cargo_config: CargoConfig,
|
||||
target_triple: String,
|
||||
target: Target,
|
||||
target_platform: TargetPlatform,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
@@ -878,13 +875,19 @@ impl AppSettings for RustAppSettings {
|
||||
.out_dir(options)
|
||||
.context("failed to get project out directory")?;
|
||||
|
||||
let ext = if self.target_triple.contains("windows") {
|
||||
"exe"
|
||||
} else {
|
||||
""
|
||||
let mut path = out_dir.join(bin_name);
|
||||
if matches!(self.target_platform, TargetPlatform::Windows) {
|
||||
// Append the `.exe` extension without overriding the existing extensions
|
||||
let extension = if let Some(extension) = path.extension() {
|
||||
let mut extension = extension.to_os_string();
|
||||
extension.push(".exe");
|
||||
extension
|
||||
} else {
|
||||
"exe".into()
|
||||
};
|
||||
path.set_extension(extension);
|
||||
};
|
||||
|
||||
Ok(out_dir.join(bin_name).with_extension(ext))
|
||||
Ok(path)
|
||||
}
|
||||
|
||||
fn get_binaries(&self) -> crate::Result<Vec<BundleBinary>> {
|
||||
@@ -897,9 +900,10 @@ impl AppSettings for RustAppSettings {
|
||||
.clone()
|
||||
.unwrap_or_default();
|
||||
for bin in bins {
|
||||
let is_main = bin.name == self.cargo_package_settings.name || bin.name == default_run;
|
||||
let file_name = bin.file_name();
|
||||
let is_main = file_name == self.cargo_package_settings.name || file_name == default_run;
|
||||
binaries.push(BundleBinary::with_path(
|
||||
bin.name.clone(),
|
||||
file_name.to_owned(),
|
||||
is_main,
|
||||
bin.path.clone(),
|
||||
))
|
||||
@@ -976,10 +980,10 @@ impl AppSettings for RustAppSettings {
|
||||
.unwrap()
|
||||
.inner
|
||||
.as_table()
|
||||
.get("package")
|
||||
.and_then(|p| p.as_table())
|
||||
.and_then(|p| p.get("name"))
|
||||
.and_then(|n| n.as_str())
|
||||
.get("package")?
|
||||
.as_table()?
|
||||
.get("name")?
|
||||
.as_str()
|
||||
.map(|n| n.to_string())
|
||||
}
|
||||
|
||||
@@ -990,10 +994,10 @@ impl AppSettings for RustAppSettings {
|
||||
.unwrap()
|
||||
.inner
|
||||
.as_table()
|
||||
.get("lib")
|
||||
.and_then(|p| p.as_table())
|
||||
.and_then(|p| p.get("name"))
|
||||
.and_then(|n| n.as_str())
|
||||
.get("lib")?
|
||||
.as_table()?
|
||||
.get("name")?
|
||||
.as_str()
|
||||
.map(|n| n.to_string())
|
||||
}
|
||||
}
|
||||
@@ -1001,8 +1005,7 @@ impl AppSettings for RustAppSettings {
|
||||
impl RustAppSettings {
|
||||
pub fn new(config: &Config, manifest: Manifest, target: Option<String>) -> crate::Result<Self> {
|
||||
let tauri_dir = tauri_dir();
|
||||
let cargo_settings =
|
||||
CargoSettings::load(tauri_dir).with_context(|| "failed to load cargo settings")?;
|
||||
let cargo_settings = CargoSettings::load(tauri_dir).context("failed to load cargo settings")?;
|
||||
let cargo_package_settings = match &cargo_settings.package {
|
||||
Some(package_info) => package_info.clone(),
|
||||
None => {
|
||||
@@ -1013,7 +1016,7 @@ impl RustAppSettings {
|
||||
};
|
||||
|
||||
let ws_package_settings = CargoSettings::load(&get_workspace_dir()?)
|
||||
.with_context(|| "failed to load cargo settings from workspace root")?
|
||||
.context("failed to load cargo settings from workspace root")?
|
||||
.workspace
|
||||
.and_then(|v| v.package);
|
||||
|
||||
@@ -1100,7 +1103,7 @@ impl RustAppSettings {
|
||||
.to_string()
|
||||
})
|
||||
});
|
||||
let target = Target::from_triple(&target_triple);
|
||||
let target_platform = TargetPlatform::from_triple(&target_triple);
|
||||
|
||||
Ok(Self {
|
||||
manifest: Mutex::new(manifest),
|
||||
@@ -1110,7 +1113,7 @@ impl RustAppSettings {
|
||||
package_settings,
|
||||
cargo_config,
|
||||
target_triple,
|
||||
target,
|
||||
target_platform,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1194,7 +1197,7 @@ fn get_cargo_option<'a>(args: &'a [String], option: &'a str) -> Option<&'a str>
|
||||
pub fn get_workspace_dir() -> crate::Result<PathBuf> {
|
||||
Ok(
|
||||
get_cargo_metadata()
|
||||
.with_context(|| "failed to get cargo metadata")?
|
||||
.context("failed to get cargo metadata")?
|
||||
.workspace_root,
|
||||
)
|
||||
}
|
||||
@@ -1435,6 +1438,7 @@ fn tauri_config_to_bundle_settings(
|
||||
frameworks: config.macos.frameworks,
|
||||
files: config.macos.files,
|
||||
bundle_version: config.macos.bundle_version,
|
||||
bundle_name: config.macos.bundle_name,
|
||||
minimum_system_version: config.macos.minimum_system_version,
|
||||
exception_domain: config.macos.exception_domain,
|
||||
signing_identity,
|
||||
|
||||
@@ -17,6 +17,7 @@ use std::{
|
||||
Arc, Mutex,
|
||||
},
|
||||
};
|
||||
use tauri_utils::platform::Target as TargetPlatform;
|
||||
|
||||
pub struct DevChild {
|
||||
manually_killed_app: Arc<AtomicBool>,
|
||||
@@ -188,16 +189,16 @@ pub fn build(
|
||||
|
||||
let lipo_status = lipo_cmd.output_ok()?.status;
|
||||
if !lipo_status.success() {
|
||||
return Err(anyhow::anyhow!(format!(
|
||||
return Err(anyhow::anyhow!(
|
||||
"Result of `lipo` command was unsuccessful: {lipo_status}. (Is `lipo` installed?)"
|
||||
)));
|
||||
));
|
||||
}
|
||||
} else {
|
||||
build_production_app(options, available_targets, config_features)
|
||||
.with_context(|| "failed to build app")?;
|
||||
}
|
||||
|
||||
rename_app(bin_path, main_binary_name)
|
||||
rename_app(bin_path, main_binary_name, &app_settings.target_platform)
|
||||
}
|
||||
|
||||
fn build_production_app(
|
||||
@@ -305,12 +306,18 @@ fn validate_target(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn rename_app(bin_path: PathBuf, main_binary_name: Option<&str>) -> crate::Result<PathBuf> {
|
||||
fn rename_app(
|
||||
bin_path: PathBuf,
|
||||
main_binary_name: Option<&str>,
|
||||
target_platform: &TargetPlatform,
|
||||
) -> crate::Result<PathBuf> {
|
||||
if let Some(main_binary_name) = main_binary_name {
|
||||
let new_path = bin_path
|
||||
.with_file_name(main_binary_name)
|
||||
.with_extension(bin_path.extension().unwrap_or_default());
|
||||
|
||||
let extension = if matches!(target_platform, TargetPlatform::Windows) {
|
||||
".exe"
|
||||
} else {
|
||||
""
|
||||
};
|
||||
let new_path = bin_path.with_file_name(format!("{main_binary_name}{extension}"));
|
||||
fs::rename(&bin_path, &new_path).with_context(|| {
|
||||
format!(
|
||||
"failed to rename `{}` to `{}`",
|
||||
|
||||
@@ -14,7 +14,7 @@ use toml_edit::{Array, DocumentMut, InlineTable, Item, TableLike, Value};
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
fs::File,
|
||||
io::{Read, Write},
|
||||
io::Write,
|
||||
path::Path,
|
||||
};
|
||||
|
||||
@@ -83,15 +83,12 @@ fn get_enabled_features(list: &HashMap<String, Vec<String>>, feature: &str) -> V
|
||||
}
|
||||
|
||||
pub fn read_manifest(manifest_path: &Path) -> crate::Result<(DocumentMut, String)> {
|
||||
let mut manifest_str = String::new();
|
||||
|
||||
let mut manifest_file = File::open(manifest_path)
|
||||
.with_context(|| format!("failed to open `{manifest_path:?}` file"))?;
|
||||
manifest_file.read_to_string(&mut manifest_str)?;
|
||||
let manifest_str = std::fs::read_to_string(manifest_path)
|
||||
.with_context(|| format!("Failed to read `{manifest_path:?}` file"))?;
|
||||
|
||||
let manifest: DocumentMut = manifest_str
|
||||
.parse::<DocumentMut>()
|
||||
.with_context(|| "failed to parse Cargo.toml")?;
|
||||
.with_context(|| "Failed to parse Cargo.toml")?;
|
||||
|
||||
Ok((manifest, manifest_str))
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ use std::{
|
||||
|
||||
pub fn migrate(tauri_dir: &Path) -> Result<MigratedConfig> {
|
||||
if let Ok((mut config, config_path)) =
|
||||
tauri_utils_v1::config::parse::parse_value(tauri_dir.join("tauri.conf.json"))
|
||||
tauri_utils::config_v1::parse::parse_value(tauri_dir.join("tauri.conf.json"))
|
||||
{
|
||||
let migrated = migrate_config(&mut config)?;
|
||||
if config_path.extension().is_some_and(|ext| ext == "toml") {
|
||||
@@ -375,16 +375,16 @@ fn process_security(security: &mut Map<String, Value>) -> Result<()> {
|
||||
let csp = if csp_value.is_null() {
|
||||
csp_value
|
||||
} else {
|
||||
let mut csp: tauri_utils_v1::config::Csp = serde_json::from_value(csp_value)?;
|
||||
let mut csp: tauri_utils::config_v1::Csp = serde_json::from_value(csp_value)?;
|
||||
match &mut csp {
|
||||
tauri_utils_v1::config::Csp::Policy(csp) => {
|
||||
tauri_utils::config_v1::Csp::Policy(csp) => {
|
||||
if csp.contains("connect-src") {
|
||||
*csp = csp.replace("connect-src", "connect-src ipc: http://ipc.localhost");
|
||||
} else {
|
||||
*csp = format!("{csp}; connect-src ipc: http://ipc.localhost");
|
||||
}
|
||||
}
|
||||
tauri_utils_v1::config::Csp::DirectiveMap(csp) => {
|
||||
tauri_utils::config_v1::Csp::DirectiveMap(csp) => {
|
||||
if let Some(connect_src) = csp.get_mut("connect-src") {
|
||||
if !connect_src.contains("ipc: http://ipc.localhost") {
|
||||
connect_src.push("ipc: http://ipc.localhost");
|
||||
@@ -392,7 +392,7 @@ fn process_security(security: &mut Map<String, Value>) -> Result<()> {
|
||||
} else {
|
||||
csp.insert(
|
||||
"connect-src".into(),
|
||||
tauri_utils_v1::config::CspDirectiveSources::List(vec![
|
||||
tauri_utils::config_v1::CspDirectiveSources::List(vec![
|
||||
"ipc: http://ipc.localhost".to_string()
|
||||
]),
|
||||
);
|
||||
@@ -422,8 +422,8 @@ fn process_security(security: &mut Map<String, Value>) -> Result<()> {
|
||||
fn process_allowlist(
|
||||
tauri_config: &mut Map<String, Value>,
|
||||
allowlist: Value,
|
||||
) -> Result<tauri_utils_v1::config::AllowlistConfig> {
|
||||
let allowlist: tauri_utils_v1::config::AllowlistConfig = serde_json::from_value(allowlist)?;
|
||||
) -> Result<tauri_utils::config_v1::AllowlistConfig> {
|
||||
let allowlist: tauri_utils::config_v1::AllowlistConfig = serde_json::from_value(allowlist)?;
|
||||
|
||||
if allowlist.protocol.asset_scope != Default::default() {
|
||||
let security = tauri_config
|
||||
@@ -447,7 +447,7 @@ fn process_allowlist(
|
||||
}
|
||||
|
||||
fn allowlist_to_permissions(
|
||||
allowlist: tauri_utils_v1::config::AllowlistConfig,
|
||||
allowlist: tauri_utils::config_v1::AllowlistConfig,
|
||||
) -> Vec<PermissionEntry> {
|
||||
macro_rules! permissions {
|
||||
($allowlist: ident, $permissions_list: ident, $object: ident, $field: ident => $associated_permission: expr) => {{
|
||||
@@ -475,8 +475,8 @@ fn allowlist_to_permissions(
|
||||
permissions!(allowlist, permissions, fs, rename_file => "fs:allow-rename");
|
||||
permissions!(allowlist, permissions, fs, exists => "fs:allow-exists");
|
||||
let (fs_allowed, fs_denied) = match allowlist.fs.scope {
|
||||
tauri_utils_v1::config::FsAllowlistScope::AllowedPaths(paths) => (paths, Vec::new()),
|
||||
tauri_utils_v1::config::FsAllowlistScope::Scope { allow, deny, .. } => (allow, deny),
|
||||
tauri_utils::config_v1::FsAllowlistScope::AllowedPaths(paths) => (paths, Vec::new()),
|
||||
tauri_utils::config_v1::FsAllowlistScope::Scope { allow, deny, .. } => (allow, deny),
|
||||
};
|
||||
if !(fs_allowed.is_empty() && fs_denied.is_empty()) {
|
||||
let fs_allowed = fs_allowed
|
||||
@@ -568,7 +568,7 @@ fn allowlist_to_permissions(
|
||||
|| allowlist.shell.all
|
||||
|| !matches!(
|
||||
allowlist.shell.open,
|
||||
tauri_utils_v1::config::ShellAllowlistOpen::Flag(false)
|
||||
tauri_utils::config_v1::ShellAllowlistOpen::Flag(false)
|
||||
)
|
||||
{
|
||||
permissions.push(PermissionEntry::PermissionRef(
|
||||
@@ -990,7 +990,7 @@ mod test {
|
||||
|
||||
#[test]
|
||||
fn can_migrate_default_config() {
|
||||
let original = serde_json::to_value(tauri_utils_v1::config::Config::default()).unwrap();
|
||||
let original = serde_json::to_value(tauri_utils::config_v1::Config::default()).unwrap();
|
||||
migrate(&original);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ use crate::{
|
||||
};
|
||||
|
||||
use anyhow::Context;
|
||||
use tauri_utils_v1::config::Allowlist;
|
||||
use tauri_utils::config_v1::Allowlist;
|
||||
use toml_edit::{DocumentMut, Entry, Item, TableLike, Value};
|
||||
|
||||
use std::path::Path;
|
||||
@@ -163,7 +163,7 @@ fn features_to_rename() -> Vec<(&'static str, &'static str)> {
|
||||
}
|
||||
|
||||
fn features_to_remove() -> Vec<&'static str> {
|
||||
let mut features_to_remove = tauri_utils_v1::config::AllowlistConfig::all_features();
|
||||
let mut features_to_remove = tauri_utils::config_v1::AllowlistConfig::all_features();
|
||||
features_to_remove.extend(&[
|
||||
"reqwest-client",
|
||||
"http-multipart",
|
||||
@@ -349,7 +349,7 @@ mod tests {
|
||||
[dependencies]
|
||||
tauri = {{ version = "1.0.0", features = [{}] }}
|
||||
"#,
|
||||
features.iter().map(|f| format!("{:?}", f)).join(", ")
|
||||
features.iter().map(|f| format!("{f:?}")).join(", ")
|
||||
)
|
||||
});
|
||||
}
|
||||
@@ -363,7 +363,7 @@ mod tests {
|
||||
version = "1.0.0"
|
||||
features = [{}]
|
||||
"#,
|
||||
features.iter().map(|f| format!("{:?}", f)).join(", ")
|
||||
features.iter().map(|f| format!("{f:?}")).join(", ")
|
||||
)
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
use super::{detect_target_ok, ensure_init, env, get_app, get_config, read_options, MobileTarget};
|
||||
use crate::{
|
||||
helpers::config::get as get_tauri_config,
|
||||
helpers::config::{get as get_tauri_config, reload as reload_tauri_config},
|
||||
interface::{AppInterface, Interface},
|
||||
mobile::CliOptions,
|
||||
Result,
|
||||
@@ -46,12 +46,33 @@ pub fn command(options: Options) -> Result<()> {
|
||||
Profile::Debug
|
||||
};
|
||||
|
||||
let tauri_config = get_tauri_config(tauri_utils::platform::Target::Android, &[])?;
|
||||
let (tauri_config, cli_options) = {
|
||||
let tauri_config = get_tauri_config(tauri_utils::platform::Target::Ios, &[])?;
|
||||
let cli_options = {
|
||||
let tauri_config_guard = tauri_config.lock().unwrap();
|
||||
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
|
||||
read_options(tauri_config_)
|
||||
};
|
||||
|
||||
let (config, metadata, cli_options) = {
|
||||
let tauri_config = if cli_options.config.is_empty() {
|
||||
tauri_config
|
||||
} else {
|
||||
// reload config with merges from the android dev|build script
|
||||
reload_tauri_config(
|
||||
&cli_options
|
||||
.config
|
||||
.iter()
|
||||
.map(|conf| &conf.0)
|
||||
.collect::<Vec<_>>(),
|
||||
)?
|
||||
};
|
||||
|
||||
(tauri_config, cli_options)
|
||||
};
|
||||
|
||||
let (config, metadata) = {
|
||||
let tauri_config_guard = tauri_config.lock().unwrap();
|
||||
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
|
||||
let cli_options = read_options(&tauri_config_.identifier);
|
||||
let (config, metadata) = get_config(
|
||||
&get_app(
|
||||
MobileTarget::Android,
|
||||
@@ -62,7 +83,7 @@ pub fn command(options: Options) -> Result<()> {
|
||||
None,
|
||||
&cli_options,
|
||||
);
|
||||
(config, metadata, cli_options)
|
||||
(config, metadata)
|
||||
};
|
||||
|
||||
ensure_init(
|
||||
|
||||
@@ -73,6 +73,11 @@ pub struct Options {
|
||||
/// Skip prompting for values
|
||||
#[clap(long, env = "CI")]
|
||||
pub ci: bool,
|
||||
/// Command line arguments passed to the runner.
|
||||
/// Use `--` to explicitly mark the start of the arguments.
|
||||
/// e.g. `tauri android build -- [runnerArgs]`.
|
||||
#[clap(last(true))]
|
||||
pub args: Vec<String>,
|
||||
}
|
||||
|
||||
impl From<Options> for BuildOptions {
|
||||
@@ -85,7 +90,7 @@ impl From<Options> for BuildOptions {
|
||||
bundles: None,
|
||||
no_bundle: false,
|
||||
config: options.config,
|
||||
args: Vec::new(),
|
||||
args: options.args,
|
||||
ci: options.ci,
|
||||
}
|
||||
}
|
||||
@@ -197,6 +202,7 @@ fn run_build(
|
||||
let interface_options = InterfaceOptions {
|
||||
debug: build_options.debug,
|
||||
target: build_options.target.clone(),
|
||||
args: build_options.args.clone(),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
@@ -213,10 +219,7 @@ fn run_build(
|
||||
config: build_options.config,
|
||||
target_device: None,
|
||||
};
|
||||
let handle = write_options(
|
||||
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,
|
||||
cli_options,
|
||||
)?;
|
||||
let handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?;
|
||||
|
||||
inject_resources(config, tauri_config.lock().unwrap().as_ref().unwrap())?;
|
||||
|
||||
|
||||
@@ -96,6 +96,11 @@ pub struct Options {
|
||||
/// Specify port for the built-in dev server for static files. Defaults to 1430.
|
||||
#[clap(long, env = "TAURI_CLI_PORT")]
|
||||
pub port: Option<u16>,
|
||||
/// Command line arguments passed to the runner.
|
||||
/// Use `--` to explicitly mark the start of the arguments.
|
||||
/// e.g. `tauri android dev -- [runnerArgs]`.
|
||||
#[clap(last(true))]
|
||||
pub args: Vec<String>,
|
||||
}
|
||||
|
||||
impl From<Options> for DevOptions {
|
||||
@@ -106,7 +111,7 @@ impl From<Options> for DevOptions {
|
||||
features: options.features,
|
||||
exit_on_panic: options.exit_on_panic,
|
||||
config: options.config,
|
||||
args: Vec::new(),
|
||||
args: options.args,
|
||||
no_watch: options.no_watch,
|
||||
no_dev_server_wait: options.no_dev_server_wait,
|
||||
no_dev_server: options.no_dev_server,
|
||||
@@ -257,7 +262,7 @@ fn run_dev(
|
||||
MobileOptions {
|
||||
debug: !options.release_mode,
|
||||
features: options.features,
|
||||
args: Vec::new(),
|
||||
args: options.args,
|
||||
config: dev_options.config.clone(),
|
||||
no_watch: options.no_watch,
|
||||
},
|
||||
@@ -275,10 +280,7 @@ fn run_dev(
|
||||
}),
|
||||
};
|
||||
|
||||
let _handle = write_options(
|
||||
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,
|
||||
cli_options,
|
||||
)?;
|
||||
let _handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?;
|
||||
|
||||
inject_resources(config, tauri_config.lock().unwrap().as_ref().unwrap())?;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ use super::{
|
||||
};
|
||||
use crate::{
|
||||
helpers::config::{BundleResources, Config as TauriConfig},
|
||||
Result,
|
||||
ConfigValue, Result,
|
||||
};
|
||||
|
||||
mod android_studio_script;
|
||||
@@ -64,6 +64,15 @@ pub struct InitOptions {
|
||||
/// Skips installing rust toolchains via rustup
|
||||
#[clap(long)]
|
||||
skip_targets_install: bool,
|
||||
/// JSON strings or paths to JSON, JSON5 or TOML files to merge with the default configuration file
|
||||
///
|
||||
/// Configurations are merged in the order they are provided, which means a particular value overwrites previous values when a config key-value pair conflicts.
|
||||
///
|
||||
/// Note that a platform-specific file is looked up and merged with the default file by default
|
||||
/// (tauri.macos.conf.json, tauri.linux.conf.json, tauri.windows.conf.json, tauri.android.conf.json and tauri.ios.conf.json)
|
||||
/// but you can use this for more specific use cases such as different build flavors.
|
||||
#[clap(short, long)]
|
||||
pub config: Vec<ConfigValue>,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
@@ -85,6 +94,7 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> {
|
||||
options.ci,
|
||||
false,
|
||||
options.skip_targets_install,
|
||||
options.config,
|
||||
)?
|
||||
}
|
||||
Commands::Dev(options) => dev::command(options, noise_level)?,
|
||||
|
||||
@@ -110,7 +110,7 @@ pub fn gen(
|
||||
map.insert("windows", cfg!(windows));
|
||||
|
||||
let identifier = config.app().identifier().replace('.', "/");
|
||||
let package_path = format!("java/{}", identifier);
|
||||
let package_path = format!("java/{identifier}");
|
||||
|
||||
map.insert("package-path", &package_path);
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ use super::{get_app, Target};
|
||||
use crate::{
|
||||
helpers::{config::get as get_tauri_config, template::JsonMap},
|
||||
interface::{AppInterface, Interface},
|
||||
Result,
|
||||
ConfigValue, Result,
|
||||
};
|
||||
use cargo_mobile2::{
|
||||
android::env::Env as AndroidEnv,
|
||||
@@ -28,11 +28,19 @@ pub fn command(
|
||||
ci: bool,
|
||||
reinstall_deps: bool,
|
||||
skip_targets_install: bool,
|
||||
config: Vec<ConfigValue>,
|
||||
) -> Result<()> {
|
||||
let wrapper = TextWrapper::default();
|
||||
|
||||
exec(target, &wrapper, ci, reinstall_deps, skip_targets_install)
|
||||
.map_err(|e| anyhow::anyhow!("{:#}", e))?;
|
||||
exec(
|
||||
target,
|
||||
&wrapper,
|
||||
ci,
|
||||
reinstall_deps,
|
||||
skip_targets_install,
|
||||
config,
|
||||
)
|
||||
.map_err(|e| anyhow::anyhow!("{:#}", e))?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -42,8 +50,12 @@ pub fn exec(
|
||||
#[allow(unused_variables)] non_interactive: bool,
|
||||
#[allow(unused_variables)] reinstall_deps: bool,
|
||||
skip_targets_install: bool,
|
||||
config: Vec<ConfigValue>,
|
||||
) -> Result<App> {
|
||||
let tauri_config = get_tauri_config(target.platform_target(), &[])?;
|
||||
let tauri_config = get_tauri_config(
|
||||
target.platform_target(),
|
||||
&config.iter().map(|conf| &conf.0).collect::<Vec<_>>(),
|
||||
)?;
|
||||
|
||||
let tauri_config_guard = tauri_config.lock().unwrap();
|
||||
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
|
||||
@@ -302,7 +314,7 @@ fn escape_kotlin_keyword(
|
||||
.split('.')
|
||||
.map(|s| {
|
||||
if KOTLIN_ONLY_KEYWORDS.contains(&s) {
|
||||
format!("`{}`", s)
|
||||
format!("`{s}`")
|
||||
} else {
|
||||
s.to_string()
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ use cargo_mobile2::{
|
||||
opts::{NoiseLevel, Profile},
|
||||
target::{call_for_targets_with_fallback, TargetInvalid, TargetTrait},
|
||||
};
|
||||
use rand::distributions::{Alphanumeric, DistString};
|
||||
use rand::distr::{Alphanumeric, SampleString};
|
||||
|
||||
use std::{
|
||||
env::{set_current_dir, var, var_os},
|
||||
@@ -83,6 +83,11 @@ pub struct Options {
|
||||
/// Use this to create a package ready for the App Store (app-store-connect option) or TestFlight (release-testing option).
|
||||
#[clap(long, value_enum)]
|
||||
pub export_method: Option<ExportMethod>,
|
||||
/// Command line arguments passed to the runner.
|
||||
/// Use `--` to explicitly mark the start of the arguments.
|
||||
/// e.g. `tauri ios build -- [runnerArgs]`.
|
||||
#[clap(last(true))]
|
||||
pub args: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, ValueEnum)]
|
||||
@@ -125,7 +130,7 @@ impl From<Options> for BuildOptions {
|
||||
bundles: None,
|
||||
no_bundle: false,
|
||||
config: options.config,
|
||||
args: Vec::new(),
|
||||
args: options.args,
|
||||
ci: options.ci,
|
||||
}
|
||||
}
|
||||
@@ -282,6 +287,7 @@ fn run_build(
|
||||
let out_dir = app_settings.out_dir(&InterfaceOptions {
|
||||
debug: build_options.debug,
|
||||
target: build_options.target.clone(),
|
||||
args: build_options.args.clone(),
|
||||
..Default::default()
|
||||
})?;
|
||||
let _lock = flock::open_rw(out_dir.join("lock").with_extension("ios"), "iOS")?;
|
||||
@@ -295,10 +301,7 @@ fn run_build(
|
||||
config: build_options.config.clone(),
|
||||
target_device: None,
|
||||
};
|
||||
let handle = write_options(
|
||||
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,
|
||||
cli_options,
|
||||
)?;
|
||||
let handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?;
|
||||
|
||||
if options.open {
|
||||
return Ok(handle);
|
||||
@@ -364,7 +367,7 @@ fn run_build(
|
||||
// we must force sign the app binary with a dummy certificate just to preserve the entitlements
|
||||
// target.export() will sign it with an actual certificate for us
|
||||
if skip_signing {
|
||||
let password = Alphanumeric.sample_string(&mut rand::thread_rng(), 16);
|
||||
let password = Alphanumeric.sample_string(&mut rand::rng(), 16);
|
||||
let certificate = tauri_macos_sign::certificate::generate_self_signed(
|
||||
tauri_macos_sign::certificate::SelfSignedCertificateRequest {
|
||||
algorithm: "rsa".to_string(),
|
||||
|
||||
@@ -101,6 +101,11 @@ pub struct Options {
|
||||
/// Specify port for the built-in dev server for static files. Defaults to 1430.
|
||||
#[clap(long, env = "TAURI_CLI_PORT")]
|
||||
pub port: Option<u16>,
|
||||
/// Command line arguments passed to the runner.
|
||||
/// Use `--` to explicitly mark the start of the arguments.
|
||||
/// e.g. `tauri ios dev -- [runnerArgs]`.
|
||||
#[clap(last(true))]
|
||||
pub args: Vec<String>,
|
||||
}
|
||||
|
||||
impl From<Options> for DevOptions {
|
||||
@@ -112,7 +117,7 @@ impl From<Options> for DevOptions {
|
||||
exit_on_panic: options.exit_on_panic,
|
||||
config: options.config,
|
||||
release_mode: options.release_mode,
|
||||
args: Vec::new(),
|
||||
args: options.args,
|
||||
no_watch: options.no_watch,
|
||||
no_dev_server: options.no_dev_server,
|
||||
no_dev_server_wait: options.no_dev_server_wait,
|
||||
@@ -265,7 +270,7 @@ fn run_dev(
|
||||
MobileOptions {
|
||||
debug: true,
|
||||
features: options.features,
|
||||
args: Vec::new(),
|
||||
args: options.args,
|
||||
config: dev_options.config.clone(),
|
||||
no_watch: options.no_watch,
|
||||
},
|
||||
@@ -279,10 +284,7 @@ fn run_dev(
|
||||
config: dev_options.config.clone(),
|
||||
target_device: None,
|
||||
};
|
||||
let _handle = write_options(
|
||||
&tauri_config.lock().unwrap().as_ref().unwrap().identifier,
|
||||
cli_options,
|
||||
)?;
|
||||
let _handle = write_options(tauri_config.lock().unwrap().as_ref().unwrap(), cli_options)?;
|
||||
|
||||
let open_xcode = || {
|
||||
if !set_host {
|
||||
|
||||
@@ -32,7 +32,7 @@ use crate::{
|
||||
config::{BundleResources, Config as TauriConfig, ConfigHandle},
|
||||
pbxproj, strip_semver_prerelease_tag,
|
||||
},
|
||||
Result,
|
||||
ConfigValue, Result,
|
||||
};
|
||||
|
||||
use std::{
|
||||
@@ -77,6 +77,15 @@ pub struct InitOptions {
|
||||
/// Skips installing rust toolchains via rustup
|
||||
#[clap(long)]
|
||||
skip_targets_install: bool,
|
||||
/// JSON strings or paths to JSON, JSON5 or TOML files to merge with the default configuration file
|
||||
///
|
||||
/// Configurations are merged in the order they are provided, which means a particular value overwrites previous values when a config key-value pair conflicts.
|
||||
///
|
||||
/// Note that a platform-specific file is looked up and merged with the default file by default
|
||||
/// (tauri.macos.conf.json, tauri.linux.conf.json, tauri.windows.conf.json, tauri.android.conf.json and tauri.ios.conf.json)
|
||||
/// but you can use this for more specific use cases such as different build flavors.
|
||||
#[clap(short, long)]
|
||||
pub config: Vec<ConfigValue>,
|
||||
}
|
||||
|
||||
#[derive(Subcommand)]
|
||||
@@ -98,6 +107,7 @@ pub fn command(cli: Cli, verbosity: u8) -> Result<()> {
|
||||
options.ci,
|
||||
options.reinstall_deps,
|
||||
options.skip_targets_install,
|
||||
options.config,
|
||||
)?
|
||||
}
|
||||
Commands::Dev(options) => dev::command(options, noise_level)?,
|
||||
@@ -514,6 +524,13 @@ pub fn synchronize_project_config(
|
||||
.unwrap()
|
||||
.identifier
|
||||
.clone();
|
||||
let product_name = tauri_config
|
||||
.lock()
|
||||
.unwrap()
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.product_name
|
||||
.clone();
|
||||
|
||||
let manual_signing = project_config.code_sign_identity.is_some()
|
||||
|| project_config.provisioning_profile_uuid.is_some();
|
||||
@@ -540,6 +557,14 @@ pub fn synchronize_project_config(
|
||||
&identifier,
|
||||
);
|
||||
|
||||
if let Some(product_name) = &product_name {
|
||||
pbxproj.set_build_settings(
|
||||
&build_configuration_ref.id,
|
||||
"PRODUCT_NAME",
|
||||
&format!("\"{product_name}\""),
|
||||
);
|
||||
}
|
||||
|
||||
if let Some(identity) = &project_config.code_sign_identity {
|
||||
let identity = format!("\"{identity}\"");
|
||||
pbxproj.set_build_settings(&build_configuration_ref.id, "CODE_SIGN_IDENTITY", &identity);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
use super::{ensure_init, env, get_app, get_config, read_options, MobileTarget};
|
||||
use crate::{
|
||||
helpers::config::get as get_tauri_config,
|
||||
helpers::config::{get as get_tauri_config, reload as reload_tauri_config},
|
||||
interface::{AppInterface, Interface, Options as InterfaceOptions},
|
||||
mobile::ios::LIB_OUTPUT_FILE_NAME,
|
||||
Result,
|
||||
@@ -82,12 +82,33 @@ pub fn command(options: Options) -> Result<()> {
|
||||
let profile = profile_from_configuration(&options.configuration);
|
||||
let macos = macos_from_platform(&options.platform);
|
||||
|
||||
let tauri_config = get_tauri_config(tauri_utils::platform::Target::Ios, &[])?;
|
||||
let (tauri_config, cli_options) = {
|
||||
let tauri_config = get_tauri_config(tauri_utils::platform::Target::Ios, &[])?;
|
||||
let cli_options = {
|
||||
let tauri_config_guard = tauri_config.lock().unwrap();
|
||||
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
|
||||
read_options(tauri_config_)
|
||||
};
|
||||
let tauri_config = if cli_options.config.is_empty() {
|
||||
tauri_config
|
||||
} else {
|
||||
// reload config with merges from the ios dev|build script
|
||||
reload_tauri_config(
|
||||
&cli_options
|
||||
.config
|
||||
.iter()
|
||||
.map(|conf| &conf.0)
|
||||
.collect::<Vec<_>>(),
|
||||
)?
|
||||
};
|
||||
|
||||
let (config, metadata, cli_options) = {
|
||||
(tauri_config, cli_options)
|
||||
};
|
||||
|
||||
let (config, metadata) = {
|
||||
let tauri_config_guard = tauri_config.lock().unwrap();
|
||||
let tauri_config_ = tauri_config_guard.as_ref().unwrap();
|
||||
let cli_options = read_options(&tauri_config_.identifier);
|
||||
let cli_options = read_options(tauri_config_);
|
||||
let (config, metadata) = get_config(
|
||||
&get_app(
|
||||
MobileTarget::Ios,
|
||||
@@ -98,7 +119,7 @@ pub fn command(options: Options) -> Result<()> {
|
||||
None,
|
||||
&cli_options,
|
||||
)?;
|
||||
(config, metadata, cli_options)
|
||||
(config, metadata)
|
||||
};
|
||||
ensure_init(
|
||||
&tauri_config,
|
||||
@@ -175,7 +196,8 @@ pub fn command(options: Options) -> Result<()> {
|
||||
|
||||
let isysroot = format!("-isysroot {}", options.sdk_root.display());
|
||||
|
||||
let simulator = options.arches.contains(&"Simulator".to_string());
|
||||
let simulator =
|
||||
options.platform == "iOS Simulator" || options.arches.contains(&"Simulator".to_string());
|
||||
let arches = if simulator {
|
||||
// when compiling for the simulator, we don't need to build other targets
|
||||
vec![if cfg!(target_arch = "aarch64") {
|
||||
@@ -206,9 +228,9 @@ pub fn command(options: Options) -> Result<()> {
|
||||
Some(rust_triple.into()),
|
||||
)?;
|
||||
|
||||
let cflags = format!("CFLAGS_{}", env_triple);
|
||||
let cxxflags = format!("CFLAGS_{}", env_triple);
|
||||
let objc_include_path = format!("OBJC_INCLUDE_PATH_{}", env_triple);
|
||||
let cflags = format!("CFLAGS_{env_triple}");
|
||||
let cxxflags = format!("CFLAGS_{env_triple}");
|
||||
let objc_include_path = format!("OBJC_INCLUDE_PATH_{env_triple}");
|
||||
let mut target_env = host_env.clone();
|
||||
target_env.insert(cflags.as_ref(), isysroot.as_ref());
|
||||
target_env.insert(cxxflags.as_ref(), isysroot.as_ref());
|
||||
|
||||
@@ -5,12 +5,11 @@
|
||||
use crate::{
|
||||
helpers::{
|
||||
app_paths::tauri_dir,
|
||||
config::{reload as reload_config, Config as TauriConfig, ConfigHandle},
|
||||
config::{reload as reload_config, Config as TauriConfig, ConfigHandle, ConfigMetadata},
|
||||
},
|
||||
interface::{AppInterface, AppSettings, DevProcess, Interface, Options as InterfaceOptions},
|
||||
ConfigValue,
|
||||
};
|
||||
#[cfg(unix)]
|
||||
use anyhow::Context;
|
||||
use anyhow::{bail, Result};
|
||||
use heck::ToSnekCase;
|
||||
@@ -365,7 +364,10 @@ fn env() -> Result<Env, EnvError> {
|
||||
pub struct OptionsHandle(#[allow(unused)] Runtime, #[allow(unused)] ServerHandle);
|
||||
|
||||
/// Writes CLI options to be used later on the Xcode and Android Studio build commands
|
||||
pub fn write_options(identifier: &str, mut options: CliOptions) -> crate::Result<OptionsHandle> {
|
||||
pub fn write_options(
|
||||
config: &ConfigMetadata,
|
||||
mut options: CliOptions,
|
||||
) -> crate::Result<OptionsHandle> {
|
||||
options.vars.extend(env_vars());
|
||||
|
||||
let runtime = Runtime::new().unwrap();
|
||||
@@ -383,18 +385,28 @@ pub fn write_options(identifier: &str, mut options: CliOptions) -> crate::Result
|
||||
let (handle, addr) = r?;
|
||||
|
||||
write(
|
||||
temp_dir().join(format!("{identifier}-server-addr")),
|
||||
temp_dir().join(format!(
|
||||
"{}-server-addr",
|
||||
config
|
||||
.original_identifier()
|
||||
.context("app configuration is missing an identifier")?
|
||||
)),
|
||||
addr.to_string(),
|
||||
)?;
|
||||
|
||||
Ok(OptionsHandle(runtime, handle))
|
||||
}
|
||||
|
||||
fn read_options(identifier: &str) -> CliOptions {
|
||||
fn read_options(config: &ConfigMetadata) -> CliOptions {
|
||||
let runtime = tokio::runtime::Runtime::new().unwrap();
|
||||
let options = runtime
|
||||
.block_on(async move {
|
||||
let addr_path = temp_dir().join(format!("{identifier}-server-addr"));
|
||||
let addr_path = temp_dir().join(format!(
|
||||
"{}-server-addr",
|
||||
config
|
||||
.original_identifier()
|
||||
.context("app configuration is missing an identifier")?
|
||||
));
|
||||
let (tx, rx) = WsTransportClientBuilder::default()
|
||||
.build(
|
||||
format!(
|
||||
|
||||
@@ -61,7 +61,7 @@ pub fn command(cli: Cli) -> Result<()> {
|
||||
|
||||
let plugin_id = prompts::input(
|
||||
"What should be the Android Package ID for your plugin?",
|
||||
Some(format!("com.plugin.{}", plugin_name)),
|
||||
Some(format!("com.plugin.{plugin_name}")),
|
||||
false,
|
||||
false,
|
||||
)?
|
||||
@@ -114,17 +114,15 @@ tauri-build = "{}"
|
||||
let init_fn = format!(
|
||||
r#"
|
||||
pub fn init<R: Runtime>() -> TauriPlugin<R> {{
|
||||
Builder::new("{name}")
|
||||
Builder::new("{plugin_name}")
|
||||
.setup(|app, api| {{
|
||||
#[cfg(target_os = "android")]
|
||||
let handle = api.register_android_plugin("{identifier}", "ExamplePlugin")?;
|
||||
let handle = api.register_android_plugin("{plugin_id}", "ExamplePlugin")?;
|
||||
Ok(())
|
||||
}})
|
||||
.build()
|
||||
}}
|
||||
"#,
|
||||
name = plugin_name,
|
||||
identifier = plugin_id
|
||||
"#
|
||||
);
|
||||
|
||||
log::info!("Android project added");
|
||||
|
||||
@@ -156,7 +156,7 @@ pub fn command(mut options: Options) -> Result<()> {
|
||||
let plugin_id = if options.android || options.mobile {
|
||||
let plugin_id = prompts::input(
|
||||
"What should be the Android Package ID for your plugin?",
|
||||
Some(format!("com.plugin.{}", plugin_name)),
|
||||
Some(format!("com.plugin.{plugin_name}")),
|
||||
false,
|
||||
false,
|
||||
)?
|
||||
|
||||
@@ -126,19 +126,18 @@ tauri-build = "{}"
|
||||
let init_fn = format!(
|
||||
r#"
|
||||
#[cfg(target_os = "ios")]
|
||||
tauri::ios_plugin_binding!(init_plugin_{name});
|
||||
tauri::ios_plugin_binding!(init_plugin_{plugin_name});
|
||||
|
||||
pub fn init<R: Runtime>() -> TauriPlugin<R> {{
|
||||
Builder::new("{name}")
|
||||
Builder::new("{plugin_name}")
|
||||
.setup(|app| {{
|
||||
#[cfg(target_os = "ios")]
|
||||
app.register_ios_plugin(init_plugin_{name})?;
|
||||
app.register_ios_plugin(init_plugin_{plugin_name})?;
|
||||
Ok(())
|
||||
}})
|
||||
.build()
|
||||
}}
|
||||
"#,
|
||||
name = plugin_name,
|
||||
);
|
||||
|
||||
log::info!("iOS project added");
|
||||
|
||||
@@ -22,8 +22,10 @@ serde_json = "1.0"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
log = "0.4"
|
||||
tauri = {{ tauri_dep }}
|
||||
tauri-plugin-log = "2.0.0-rc"
|
||||
tauri-plugin-log = "2"
|
||||
{{#if patch_tauri_dep}}
|
||||
[patch.crates-io]
|
||||
tauri = {{ tauri_dep }}
|
||||
tauri-utils = {{ tauri_utils_dep }}
|
||||
tauri-plugin = {{ tauri_plugin_dep }}
|
||||
{{/if}}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
"@tauri-apps/api": ">=2.0.0-beta.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-typescript": "^11.1.6",
|
||||
"@rollup/plugin-typescript": "^12.0.0",
|
||||
"rollup": "^4.9.6",
|
||||
"typescript": "^5.3.3",
|
||||
"tslib": "^2.6.2"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user