diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e9bca8..54f7901 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -47,7 +47,7 @@ on: jobs: # Run 'dist plan' (or host) to determine what tasks we need to do plan: - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" outputs: val: ${{ steps.plan.outputs.manifest }} tag: ${{ !github.event.pull_request && github.ref_name || '' }} @@ -160,7 +160,7 @@ jobs: needs: - plan - build-local-artifacts - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json @@ -210,7 +210,7 @@ jobs: if: ${{ always() && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" outputs: val: ${{ steps.host.outputs.manifest }} steps: @@ -274,7 +274,7 @@ jobs: # still allowing individual publish jobs to skip themselves (for prereleases). # "host" however must run to completion, no skipping allowed! if: ${{ always() && needs.host.result == 'success' }} - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: diff --git a/Cargo.lock b/Cargo.lock index cfe31bc..e127080 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,6 +187,38 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cargo_toml" version = "0.21.0" @@ -1269,6 +1301,7 @@ dependencies = [ name = "rmkit" version = "0.0.11" dependencies = [ + "cargo_metadata", "cargo_toml", "clap", "futures", @@ -1365,6 +1398,15 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + [[package]] name = "serde" version = "1.0.217" diff --git a/Cargo.toml b/Cargo.toml index ddf04a2..1934ebc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,7 @@ futures-util = "0.3.31" walkdir = "2" inquire = "0.7.5" cargo_toml = "0.21" +cargo_metadata = "0.19.2" # The profile that 'dist' will build with [profile.dist] diff --git a/dist-workspace.toml b/dist-workspace.toml index 1791311..c67248c 100644 --- a/dist-workspace.toml +++ b/dist-workspace.toml @@ -15,3 +15,7 @@ targets = ["aarch64-apple-darwin", "x86_64-apple-darwin", "x86_64-unknown-linux- install-path = "CARGO_HOME" # Whether to install an updater program install-updater = false +# Use this until cargo dist supports ubuntu > 20.04 (https://github.com/axodotdev/cargo-dist/issues/1760#issuecomment-2769218034) +[dist.github-custom-runners] +global = "ubuntu-22.04" +x86_64-unknown-linux-gnu = "ubuntu-22.04" diff --git a/src/main.rs b/src/main.rs index df07fcf..2b32a5d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,4 @@ +use cargo_metadata::{Metadata, MetadataCommand}; use chip::get_chip_options; use clap::Parser; use futures::stream::StreamExt; @@ -116,7 +117,10 @@ fn post_process(project_info: ProjectInfo) -> Result<(), Box> { // If the keyboard is row2col, update generated Cargo.toml if project_info.row2col { - disable_rmk_default_feature(&project_info.target_dir)?; + let metadata = MetadataCommand::new() + .current_dir(&project_info.target_dir) + .exec()?; + disable_rmk_default_features(&project_info.target_dir, &metadata, &["col2row"])?; } Ok(()) @@ -436,7 +440,11 @@ fn copy_dir_recursive(src: &Path, dest: &Path) -> io::Result<()> { /// /// # Returns /// * `Result<(), String>` - 成功返回 Ok,失败返回 Err -fn disable_rmk_default_feature(target_dir: &PathBuf) -> Result<(), String> { +fn disable_rmk_default_features( + target_dir: &PathBuf, + metadata: &Metadata, + features: &[&str], +) -> Result<(), String> { // 定义 Cargo.toml 的路径 let cargo_toml_path = Path::new(target_dir).join("Cargo.toml"); @@ -447,7 +455,14 @@ fn disable_rmk_default_feature(target_dir: &PathBuf) -> Result<(), String> { // 获取 dependencies 并修改 rmk 配置 if let Some(cargo_toml::Dependency::Detailed(rmk_dep)) = manifest.dependencies.get_mut("rmk") { // 设置 default-features = false,并保留原始 version 和 features - rmk_dep.default_features = false + let mut default_features = get_dependency_default_features("rmk", metadata)?; + default_features.retain(|s| !features.contains(&s.as_str())); + + rmk_dep.features.append(&mut default_features); + rmk_dep.features.sort_unstable(); + rmk_dep.features.dedup(); + + rmk_dep.default_features = false; } else { return Err("No valid rmk dependency found".to_string()); } @@ -462,3 +477,18 @@ fn disable_rmk_default_feature(target_dir: &PathBuf) -> Result<(), String> { Ok(()) } + +fn get_dependency_default_features( + dependency: &str, + metadata: &Metadata, +) -> Result, String> { + let dep = metadata + .packages + .iter() + .find(|p| p.name == dependency) + .ok_or(format!("Failed to find {} in dependencies", dependency))?; + dep.features + .get("default") + .cloned() + .ok_or(format!("Failed to get default {} features", dependency)) +}