publish 是一个很薄的客户端。它不编译、不打包,也不上传任何东西。它向平台发送一个带身份认证的请求,然后打印平台返回的那个 URL。
什么时候使用 publish
- 给评审者发一个构建链接,而不是一个 zip 文件。
- 在
build产出产物之后,把分享链接接进 CI。 - 把分享链接固定到某一个特定构建,而不是项目的最新构建。
publish 解析的是一个已经存在于 extension.dev 上的项目,所以它需要平台已经记录过的构建。如果你想把此刻正躺在你自己 dist/ 里的构建发给别人,请改为上传那个构建:Share an unpublished build for review。
publish 与 extension.dev 平台通信,而它是独立于 Extension.js
的另一个产品。那些在你本机运行的 Extension.js 命令(create、dev、build、preview、start)从来不需要账号,publish
需要。用法
令牌要求
没有访问令牌时,publish 拒绝运行。它按以下顺序在三个地方查找:
- 命令行上的
--token <token>。 - 环境变量
EXTENSION_DEV_TOKEN(CI 中推荐用这个)。 npx @extension.dev/mcp login写下的已存储设备登录。
1 退出,并向 stderr 打印:
作用域检查
一次已存储的设备登录只对应一个项目。从一个无关的目录发布,会为那个项目生成一个分享链接,而任何显眼的地方都不会写明它到底属于谁。publish 把这种不匹配当作拒绝,而不是警告:
- 当目录的项目名与已存储登录的项目对不上时,命令拒绝执行,并把两者都列出来。
- 传
--project <slug>,就可以在任何位置有意地发布该登录对应的项目。 - 传入的
--projectslug 与已存储登录不匹配时,同样会被拒绝。 - 使用
--token或EXTENSION_DEV_TOKEN提供的令牌时,会完全跳过与已存储登录的比对。
package.json、manifest.json、src/manifest.json,最后才是文件夹名。
参数与 flag
它会打印什么
pretty 输出只有一行,就是分享 URL,因此可以干净地用在管道里:--output json 打印一个信封。平台响应放在 value 里,而它携带的不只是那个 URL:
value.shareUrl 和 value.visibility,没有需要携带的令牌。
带上 --build-sha 时,URL 指向的是那个构建,而不是项目总览页:https://<workspace>.extension.dev/<project>/builds/<sha>。
公开项目与私有项目
一个项目要么是公开的,要么是私有的。publish 只读取这个设置,从不修改它。你拿到哪种链接由平台决定:
两种回答指向的是同一个页面。可见性决定的是要不要附上令牌,而不是你拿到哪个地址。
固定到某一个构建
--build-sha 链接到某一个构建,而不是项目的最新构建。平台会拿这个 sha 去比对项目的构建索引,当没有任何已完成的构建匹配时,返回 404 和 UNKNOWN_BUILD 代码,所以一个拼写错误会明确地失败,而不是产出一个指向错误产物的链接。
示例
在 CI 中发布
给某一位评审者的短期链接
行为说明
publish从不编译。想让链接指向新鲜的输出时,请先运行build。- 每一条失败路径都以退出码
1退出:令牌缺失、平台不可达,或任何非 2xx 响应——后者会打印为publish failed (<status>): <message>。 --api接受带结尾斜杠或不带结尾斜杠的基础 URL。命令会自己补上/api/cli/publish。--ttl会被平台钳制在 1 到 168 小时的范围内。- 这个命令返回的
?share=令牌,不是那个可撤销的 30 天预览链接。那种链接来自另一个动作,它会上传构建;而publish什么都不上传。参见 平台的 publish 页面。
下一步
- 用
build产出要分享的产物。 - 先用
preview在本地验证这些产物。 - 不用 zip、也不用安装,把一个未发布的构建通过链接交给别人,参见 Share an unpublished build for review。
- 在 Builds 中了解构建是怎么被记录的。

