apm install --production 是离线打包的唯一可靠命令;必须在与目标机完全一致的 Atom 版本下执行,确保生成完整 node_modules 并跳过无用 devDependencies,且插件路径结构、命名及依赖需严格匹配。

apm install --production 是离线打包的唯一可靠命令
直接复制 GitHub 源码 ZIP 到 ~/.atom/packages 目录,99% 会失败——因为插件启动时 require 的模块(如 season、fs-plus)根本不存在。Atom 不会自动执行依赖安装,它只加载已构建完成的包。
正确做法是在**与目标离线机完全一致的 Atom 版本**下运行:
-
apm install --production linter-gcc(替换为你要打包的插件名) - 执行后检查
~/.atom/packages/linter-gcc/node_modules是否存在,且包含gcc、atom-linter等子目录 -
--production关键:跳过devDependencies,避免装入测试工具或文档生成器等离线无用项,同时规避因构建脚本联网失败导致的中断 - 别用
npm install替代:它不触发 Atom 特有的postinstall脚本(如编译 native 模块、生成语法缓存),linter-gcc就会卡在调用gcc二进制环节
插件文件夹必须放对路径,且不能有多余嵌套
常见错误是把解压后的 atom-beautify-master/ 整个文件夹再套一层放进 packages,结果路径变成 ~/.atom/packages/atom-beautify-master/atom-beautify-master/ —— Atom 扫描时找不到 package.json,直接忽略。
正确结构只有一层:
- macOS/Linux:
~/.atom/packages/autocomplete-python/(该目录下直接有package.json、lib/、node_modules/) - Windows:
%USERPROFILE%\.atom\packages\language-rust\(注意反斜杠,且文件夹名必须与package.json中"name"字段完全一致,大小写敏感) - 别放错父目录:不是
~/.atom根目录,也不是~/.atom/installed-packages(这个路径不存在) - 避开云同步干扰:OneDrive/iCloud 同步的
.atom目录可能导致 Atom 实际读取的是远程路径,造成插件“存在但不加载”
离线机上插件不生效?先看开发者工具 Console 报错
重启 Atom 后插件没反应,不要猜,打开 Ctrl+Shift+I → Console 标签页,典型线索包括:
-
Error: Cannot find module 'season'→node_modules缺失或未完整拷贝 -
Failed to activate package 'autocomplete-python' because it depends on 'language-python@^0.49.0'→ 依赖插件未一并离线安装 -
Cannot read property 'onDidStopChanging' of undefined→ 插件在 v1.72.0 构建,却放到 v1.69.0 的离线机上运行,Atom API 不兼容 -
require is not defined→ 插件用了 Webpack 打包但未产出dist/目录,源码不能直接跑
此时应返回打包机,确认 apm --version 与离线机 atom --version 输出完全一致,并重新执行 apm install --production。
三类插件注定无法真正离线使用
有些插件即使把 node_modules 和全部代码都拷过去,启动时仍会失败。它们依赖运行时网络行为,离线部署前必须甄别:
- 依赖实时 API:如
autocomplete-atom-api(首次启用时请求https://api.github.com/repos/atom/atom/git/trees/...获取 API 文档) - 含动态下载逻辑:如某些版本的
language-rust会在激活时拉取rustc语法定义,URL 写死在lib/main.js里 - 需要全局 apm 运行时:如
sync-settings,内部调用apm login和apm publish,离线机从未连过服务器就初始化失败
这类插件控制台通常报 Failed to fetch https://... 或卡在 fetching...,没有绕过办法——得换用纯本地实现的替代品,比如用 autocomplete-plus + 本地词典,而非依赖 GitHub 的补全源。

















