refactor!: use tauri.conf.json > identifier as package name and bundle id, close #9851 (#9858)

* fix(android): use identifier as Android package name

* update android_binding and android_fn interface

* chore: rename TAURI_ANDROID_PACKAGE_PREFIX to TAURI_ANDROID_PACKAGE_NAME

* revert back to split prefix and app_name

* rename `domain` to `identifier`

* add change log

* simplify reverse config identifier

* Update .changes/mobile-use-identifier-as-id.md

* Update core/tauri-build/src/lib.rs

* lint

* cargo-mobile2 0.12

* fmt

---------

Co-authored-by: Lucas Nogueira <lucas@tauri.app>
This commit is contained in:
Jason Tsai 2024-05-24 20:22:41 +08:00 committed by GitHub
parent 8a1ae2deaf
commit 1df5cdeb06
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 101 additions and 77 deletions

View File

@ -0,0 +1,9 @@
---
"tauri": patch:breaking
"tauri-build": patch:breaking
"tauri-cli": patch:breaking
"@tauri-apps/cli": patch:breaking
"tauri-macros": patch:breaking
---
Use `tauri.conf.json > identifier` to set the `PackageName` in Android and `BundleId` in iOS.

View File

@ -459,13 +459,15 @@ pub fn try_build(attributes: Attributes) -> Result<()> {
let last = s.clone().count() - 1; let last = s.clone().count() - 1;
let mut android_package_prefix = String::new(); let mut android_package_prefix = String::new();
for (i, w) in s.enumerate() { for (i, w) in s.enumerate() {
if i == 0 || i != last { if i == last {
println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_NAME_APP_NAME={}", w);
} else {
android_package_prefix.push_str(w); android_package_prefix.push_str(w);
android_package_prefix.push('_'); android_package_prefix.push('_');
} }
} }
android_package_prefix.pop(); android_package_prefix.pop();
println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_PREFIX={android_package_prefix}"); println!("cargo:rustc-env=TAURI_ANDROID_PACKAGE_NAME_PREFIX={android_package_prefix}");
if let Some(project_dir) = var_os("TAURI_ANDROID_PROJECT_PATH").map(PathBuf::from) { if let Some(project_dir) = var_os("TAURI_ANDROID_PROJECT_PATH").map(PathBuf::from) {
mobile::generate_gradle_files(project_dir)?; mobile::generate_gradle_files(project_dir)?;

View File

@ -37,9 +37,14 @@ pub fn entry_point(_attributes: TokenStream, item: TokenStream) -> TokenStream {
let function_name = &function.sig.ident; let function_name = &function.sig.ident;
let mut error = None; let mut error = None;
let domain = get_env_var("TAURI_ANDROID_PACKAGE_PREFIX", |r| r, &mut error, &function); let domain = get_env_var(
"TAURI_ANDROID_PACKAGE_NAME_PREFIX",
|r| r,
&mut error,
&function,
);
let app_name = get_env_var( let app_name = get_env_var(
"CARGO_PKG_NAME", "TAURI_ANDROID_PACKAGE_NAME_APP_NAME",
|r| r.replace('-', "_"), |r| r.replace('-', "_"),
&mut error, &mut error,
&function, &function,

View File

@ -129,17 +129,17 @@ pub type WryHandle = tauri_runtime_wry::WryHandle<EventLoopMessage>;
#[doc(hidden)] #[doc(hidden)]
#[macro_export] #[macro_export]
macro_rules! android_binding { macro_rules! android_binding {
($domain:ident, $package:ident, $main: ident, $wry: path) => { ($domain:ident, $app_name:ident, $main:ident, $wry:path) => {
use $wry::{ use $wry::{
android_setup, android_setup,
prelude::{JClass, JNIEnv, JString}, prelude::{JClass, JNIEnv, JString},
}; };
::tauri::wry::android_binding!($domain, $package, $wry); ::tauri::wry::android_binding!($domain, $app_name, $wry);
::tauri::tao::android_binding!( ::tauri::tao::android_binding!(
$domain, $domain,
$package, $app_name,
WryActivity, WryActivity,
android_setup, android_setup,
$main, $main,

View File

@ -3007,7 +3007,7 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f"
[[package]] [[package]]
name = "tauri" name = "tauri"
version = "2.0.0-beta.19" version = "2.0.0-beta.20"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@ -3057,7 +3057,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-build" name = "tauri-build"
version = "2.0.0-beta.15" version = "2.0.0-beta.16"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"cargo_toml", "cargo_toml",
@ -3079,7 +3079,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-codegen" name = "tauri-codegen"
version = "2.0.0-beta.15" version = "2.0.0-beta.16"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"brotli", "brotli",
@ -3104,7 +3104,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-macros" name = "tauri-macros"
version = "2.0.0-beta.15" version = "2.0.0-beta.16"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro2", "proc-macro2",
@ -3116,7 +3116,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-plugin" name = "tauri-plugin"
version = "2.0.0-beta.15" version = "2.0.0-beta.16"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"glob", "glob",
@ -3152,7 +3152,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime" name = "tauri-runtime"
version = "2.0.0-beta.16" version = "2.0.0-beta.17"
dependencies = [ dependencies = [
"dpi", "dpi",
"gtk", "gtk",
@ -3169,7 +3169,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-runtime-wry" name = "tauri-runtime-wry"
version = "2.0.0-beta.16" version = "2.0.0-beta.17"
dependencies = [ dependencies = [
"cocoa", "cocoa",
"gtk", "gtk",
@ -3191,7 +3191,7 @@ dependencies = [
[[package]] [[package]]
name = "tauri-utils" name = "tauri-utils"
version = "2.0.0-beta.15" version = "2.0.0-beta.16"
dependencies = [ dependencies = [
"aes-gcm", "aes-gcm",
"brotli", "brotli",

71
tooling/cli/Cargo.lock generated
View File

@ -483,9 +483,9 @@ dependencies = [
[[package]] [[package]]
name = "cargo-mobile2" name = "cargo-mobile2"
version = "0.11.0" version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6eb3459f8fb1fd0e12ca229db09cd763befe00827061cc5aaf6bdf173dad37c" checksum = "79fadc84c218c513afcace5b0115bf615fb1c64dac782c1978f1620491339d7d"
dependencies = [ dependencies = [
"colored", "colored",
"core-foundation", "core-foundation",
@ -495,7 +495,7 @@ dependencies = [
"embed-resource", "embed-resource",
"english-numbers", "english-numbers",
"freedesktop_entry_parser", "freedesktop_entry_parser",
"handlebars 4.5.0", "handlebars",
"heck 0.5.0", "heck 0.5.0",
"home", "home",
"ignore", "ignore",
@ -1795,20 +1795,6 @@ dependencies = [
"crunchy", "crunchy",
] ]
[[package]]
name = "handlebars"
version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225"
dependencies = [
"log",
"pest",
"pest_derive",
"serde",
"serde_json",
"thiserror",
]
[[package]] [[package]]
name = "handlebars" name = "handlebars"
version = "5.1.0" version = "5.1.0"
@ -4862,7 +4848,7 @@ dependencies = [
"dunce", "dunce",
"flate2", "flate2",
"glob", "glob",
"handlebars 5.1.0", "handlebars",
"heck 0.5.0", "heck 0.5.0",
"hex", "hex",
"image", "image",
@ -4912,7 +4898,7 @@ dependencies = [
"dunce", "dunce",
"env_logger", "env_logger",
"glob", "glob",
"handlebars 5.1.0", "handlebars",
"heck 0.5.0", "heck 0.5.0",
"html5ever", "html5ever",
"ignore", "ignore",
@ -5872,15 +5858,14 @@ checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082"
[[package]] [[package]]
name = "which" name = "which"
version = "5.0.0" version = "6.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bf3ea8596f3a0dd5980b46430f2058dfe2c36a27ccfbb1845d6fbfcd9ba6e14" checksum = "8211e4f58a2b2805adfbefbc07bab82958fc91e3836339b1ab7ae32465dce0d7"
dependencies = [ dependencies = [
"either", "either",
"home", "home",
"once_cell",
"rustix 0.38.31", "rustix 0.38.31",
"windows-sys 0.48.0", "winsafe",
] ]
[[package]] [[package]]
@ -5916,11 +5901,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "windows" name = "windows"
version = "0.54.0" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" checksum = "1de69df01bdf1ead2f4ac895dc77c9351aefff65b2f3db429a343f9cbf05e132"
dependencies = [ dependencies = [
"windows-core 0.54.0", "windows-core 0.56.0",
"windows-targets 0.52.5", "windows-targets 0.52.5",
] ]
@ -5935,14 +5920,38 @@ dependencies = [
[[package]] [[package]]
name = "windows-core" name = "windows-core"
version = "0.54.0" version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6"
dependencies = [ dependencies = [
"windows-implement",
"windows-interface",
"windows-result", "windows-result",
"windows-targets 0.52.5", "windows-targets 0.52.5",
] ]
[[package]]
name = "windows-implement"
version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6fc35f58ecd95a9b71c4f2329b911016e6bec66b3f2e6a4aad86bd2e99e2f9b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.52",
]
[[package]]
name = "windows-interface"
version = "0.56.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08990546bf4edef8f431fa6326e032865f27138718c587dc21bc0265bbcb57cc"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.52",
]
[[package]] [[package]]
name = "windows-result" name = "windows-result"
version = "0.1.1" version = "0.1.1"
@ -6148,6 +6157,12 @@ dependencies = [
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
[[package]]
name = "winsafe"
version = "0.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
[[package]] [[package]]
name = "x25519-dalek" name = "x25519-dalek"
version = "2.0.1" version = "2.0.1"

View File

@ -39,7 +39,7 @@ name = "cargo-tauri"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [dependencies]
cargo-mobile2 = { version = "0.11", default-features = false } cargo-mobile2 = { version = "0.12", default-features = false }
jsonrpsee = { version = "0.22", features = [ "server" ] } jsonrpsee = { version = "0.22", features = [ "server" ] }
jsonrpsee-core = "0.22" jsonrpsee-core = "0.22"
jsonrpsee-client-transport = { version = "0.22", features = [ "ws" ] } jsonrpsee-client-transport = { version = "0.22", features = [ "ws" ] }

View File

@ -133,17 +133,13 @@ pub fn get_config(
..Default::default() ..Default::default()
}; };
set_var( set_var("WRY_ANDROID_PACKAGE", app.reverse_identifier());
"WRY_ANDROID_PACKAGE",
format!("{}.{}", app.reverse_domain(), app.name_snake()),
);
set_var("WRY_ANDROID_LIBRARY", app.lib_name()); set_var("WRY_ANDROID_LIBRARY", app.lib_name());
set_var("TAURI_ANDROID_PROJECT_PATH", config.project_dir()); set_var("TAURI_ANDROID_PROJECT_PATH", config.project_dir());
let src_main_dir = config.project_dir().join("app/src/main").join(format!( let src_main_dir = config.project_dir().join("app/src/main").join(format!(
"java/{}/{}", "java/{}",
app.reverse_domain().replace('.', "/"), app.reverse_identifier().replace('.', "/"),
app.name_snake()
)); ));
if config.project_dir().exists() { if config.project_dir().exists() {
if src_main_dir.exists() { if src_main_dir.exists() {

View File

@ -109,8 +109,8 @@ pub fn gen(
); );
map.insert("windows", cfg!(windows)); map.insert("windows", cfg!(windows));
let domain = config.app().reverse_domain().replace('.', "/"); let identifier = config.app().reverse_identifier().replace('.', "/");
let package_path = format!("java/{}/{}", domain, config.app().name_snake()); let package_path = format!("java/{}", identifier);
map.insert("package-path", &package_path); map.insert("package-path", &package_path);

View File

@ -288,24 +288,21 @@ fn read_options(identifier: &str) -> CliOptions {
} }
pub fn get_app(config: &TauriConfig, interface: &AppInterface) -> App { pub fn get_app(config: &TauriConfig, interface: &AppInterface) -> App {
let mut s = config.identifier.rsplit('.'); let identifier = config
let app_name = s.next().unwrap_or("app").to_string(); .identifier
let mut domain = String::new(); .rsplit('.')
for w in s { .collect::<Vec<&str>>()
domain.push_str(w); .join(".");
domain.push('.');
} if identifier.is_empty() {
if domain.is_empty() { log::error!("Bundle identifier set in `tauri.conf.json > identifier` cannot be empty");
domain.clone_from(&config.identifier); exit(1);
if domain.is_empty() {
log::error!("Bundle identifier set in `tauri.conf.json > identifier` cannot be empty");
exit(1);
}
} else {
domain.pop();
} }
let app_name = interface.app_settings().app_name().unwrap_or(app_name); let app_name = interface
.app_settings()
.app_name()
.unwrap_or_else(|| "app".into());
let lib_name = interface let lib_name = interface
.app_settings() .app_settings()
.lib_name() .lib_name()
@ -315,7 +312,7 @@ pub fn get_app(config: &TauriConfig, interface: &AppInterface) -> App {
name: app_name, name: app_name,
lib_name: Some(lib_name), lib_name: Some(lib_name),
stylized_name: config.product_name.clone(), stylized_name: config.product_name.clone(),
domain, identifier,
asset_dir: None, asset_dir: None,
template_pack: None, template_pack: None,
}; };

View File

@ -8,10 +8,10 @@ plugins {
android { android {
compileSdk = 33 compileSdk = 33
namespace = "{{reverse-domain app.domain}}.{{snake-case app.name}}" namespace = "{{reverse-domain app.identifier}}"
defaultConfig { defaultConfig {
manifestPlaceholders["usesCleartextTraffic"] = "false" manifestPlaceholders["usesCleartextTraffic"] = "false"
applicationId = "{{reverse-domain app.domain}}.{{snake-case app.name}}" applicationId = "{{reverse-domain app.identifier}}"
minSdk = {{android.min-sdk-version}} minSdk = {{android.min-sdk-version}}
targetSdk = 33 targetSdk = 33
versionCode = 1 versionCode = 1

View File

@ -1,3 +1,3 @@
package {{reverse-domain app.domain}}.{{snake-case app.name}} package {{reverse-domain app.identifier}}
class MainActivity : TauriActivity() class MainActivity : TauriActivity()

View File

@ -1,6 +1,6 @@
name: {{app.name}} name: {{app.name}}
options: options:
bundleIdPrefix: {{reverse-domain app.domain}} bundleIdPrefix: {{reverse-domain app.identifier}}
deploymentTarget: deploymentTarget:
iOS: {{apple.ios-version}} iOS: {{apple.ios-version}}
fileGroups: [{{join file-groups}}] fileGroups: [{{join file-groups}}]
@ -11,7 +11,7 @@ settingGroups:
app: app:
base: base:
PRODUCT_NAME: {{app.stylized-name}} PRODUCT_NAME: {{app.stylized-name}}
PRODUCT_BUNDLE_IDENTIFIER: {{reverse-domain app.domain}}.{{app.name}} PRODUCT_BUNDLE_IDENTIFIER: {{reverse-domain app.identifier}}
{{#if apple.development-team}} {{#if apple.development-team}}
DEVELOPMENT_TEAM: {{apple.development-team}} DEVELOPMENT_TEAM: {{apple.development-team}}
{{/if}} {{/if}}