diff --git a/.gitignore b/.gitignore index 750baeb..4df15d8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ result result-* +spark-store/ \ No newline at end of file diff --git a/nix/module.nix b/nix/module.nix index 01795ad..799ebd1 100644 --- a/nix/module.nix +++ b/nix/module.nix @@ -7,6 +7,7 @@ let cfg = config.programs.amber-pm; + apmXdgDataDir = "/var/lib/apm/apm/files/ace-env/amber-ce-tools/data-dir"; aceRuntimePath = lib.makeBinPath (with pkgs; [ bash @@ -34,6 +35,19 @@ in config = lib.mkIf cfg.enable { environment.systemPackages = [ cfg.package ]; + environment.sessionVariables.XDG_DATA_DIRS = lib.mkAfter [ apmXdgDataDir ]; + environment.etc."systemd/user-environment-generators/60-apm".source = + pkgs.writeShellScript "60-apm" '' + apm_xdg_data_dir=${lib.escapeShellArg apmXdgDataDir} + xdg_data_dirs="''${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" + + case ":$xdg_data_dirs:" in + *":$apm_xdg_data_dir:"*) ;; + *) xdg_data_dirs="$xdg_data_dirs:$apm_xdg_data_dir" ;; + esac + + printf 'XDG_DATA_DIRS=%s\n' "$xdg_data_dirs" + ''; programs.nix-ld.enable = lib.mkDefault true; diff --git a/src/usr/bin/amber-pm-convert b/src/usr/bin/amber-pm-convert index 1729fc6..67a496b 100755 --- a/src/usr/bin/amber-pm-convert +++ b/src/usr/bin/amber-pm-convert @@ -8,6 +8,10 @@ log.debug() { echo -e "[\e[32mDEBUG\e[0m]: \e[1m$*\e[0m"; } SCRIPT_NAME=$(basename "$0") +is_nixos() { + [ -r /etc/os-release ] && . /etc/os-release && [ "${ID:-}" = "nixos" ] +} + if ! command -v dpkg > /dev/null ; then log.error "若想使用APM软件包转换器,您需先安装dpkg" exit 1 @@ -617,6 +621,12 @@ interactive_copy_entries() { process_desktop_file() { local desktop_file="$1" local pkgname="$2" + local apm_exec_prefix="apm run $pkgname" + + if is_nixos; then + apm_exec_prefix="/run/current-system/sw/bin/apm run $pkgname" + fi + # 新增:精确路径检查 local apps_path1="/usr/share/applications" local apps_path2="/opt/apps/${ORIG_PKGNAME}/entries/applications" @@ -632,16 +642,16 @@ process_desktop_file() { log.info "处理桌面文件: $desktop_file" # 检查文件是否已经处理过(避免重复添加 apm run) - if grep -q "^Exec=apm run $pkgname " "$desktop_file"; then + if grep -q "^Exec=${apm_exec_prefix} " "$desktop_file"; then log.info "桌面文件已经处理过,跳过: $desktop_file" return 0 fi # 检查是否有其他包的 apm run 前缀(清理旧的) - if grep -q "^Exec=apm run [^ ]* " "$desktop_file"; then + if grep -Eq "^Exec=(/run/current-system/sw/bin/)?apm run [^ ]* " "$desktop_file"; then log.info "发现旧的 apm run 前缀,清理后重新添加" # 移除所有 apm run 前缀 - sed -i "s|^Exec=apm run [^ ]* ||" "$desktop_file" + sed -i -E "s|^Exec=(/run/current-system/sw/bin/)?apm run [^ ]* |Exec=|" "$desktop_file" fi # 尝试用 busybox dos2unix(若不存在则跳过转换) @@ -653,7 +663,7 @@ process_desktop_file() { # 处理 Exec 行:在原有命令前追加 apm run $pkgname if grep -q '^Exec=' "$desktop_file"; then - sed -i "s|^Exec=\(.*\)$|Exec=apm run $pkgname \1|" "$desktop_file" + sed -i "s|^Exec=\(.*\)$|Exec=${apm_exec_prefix} \1|" "$desktop_file" fi # 删除 TryExec 行