apm install 不支持离线指定版本号安装,因版本解析依赖在线 registry;正确做法是通过 GitHub Tags 下载对应版本 ZIP 包,解压后验证 package.json 中 version 和 engines 字段。

不能直接指定版本号安装离线插件——Atom 的 apm install 命令在离线环境下不支持 @version 语法,且版本解析依赖在线 registry。
为什么 apm install linter-gcc@2.0.0 在离线时必然失败
该命令在联网时会向 https://atom.io/api/packages 查询版本清单、下载 tarball 并校验签名;离线后:apm 根本无法解析 @ 后的版本标识,直接报错 Error: Invalid package name "linter-gcc@2.0.0" 或卡在 fetch 阶段。这不是网络超时,而是命令本身被设计为必须联网才能识别带版本号的包名。
正确获取指定版本插件的离线副本
必须放弃“在线查版本 → 离线装”的思路,改用源码 + 版本标签方式定位:
- 打开插件 GitHub 页面(如
https://github.com/AtomLinter/linter-gcc),点击Tags页签,找到目标版本(如v2.0.0) - 点击该 tag 进入快照页,右上角点
Code → Download ZIP,得到linter-gcc-v2.0.0.zip - 解压后进入目录,确认
package.json中"version"字段确为"2.0.0",且"engines"兼容你的 Atom 版本(如"atom": ">=1.58.0 ) - 不要直接复制这个 ZIP 解压结果到
~/.atom/packages—— 它没有node_modules,启动必报Cannot find module 'atom-linter'
必须在匹配环境里运行 apm install --production
离线部署的本质不是“搬运代码”,而是复现构建过程。关键约束有三个:
- 构建机 Atom 版本必须与目标机**完全一致**(例如都是
1.69.0),否则apm会拒绝加载或触发Cannot read property 'onDidStopChanging' of undefined - 构建机必须用官方安装包(
atom-amd64.deb/AtomSetup-x64.exe),否则apm二进制缺失,apm install命令根本不存在 - 进入插件目录后,执行:
apm install --production(不带包名!只在已有源码目录下运行),它会读取本地package.json并精确安装所声明的依赖树 - 执行完检查目录下是否存在
node_modules,且其中包含atom-linter、fs-plus等子目录 —— 缺一不可
哪些插件根本没法锁定版本离线使用
三类插件即使你手动下载了 v2.0.0 源码,也做不到“真正离线”:
- 依赖实时 API 的:如
autocomplete-atom-api,启动时仍要访问https://api.github.com/repos/atom/atom/git/trees/...获取文档,离线即卡死 - 含动态下载逻辑的:如某些
language-rust版本会在首次启用时调用fetch()拉取语法文件,控制台可见Failed to fetch https://... - 需要全局 apm 登录态的:如
sync-settings,离线机从未执行过apm login,其初始化函数会直接 throw 错误
这类插件的 package.json 里往往有 "activationHooks": ["core:loaded"] 或空钩子,意味着它们不等文件打开就强行启动,失败得更早、更安静。

















