Skip to main content
extension.dev 索取一个可分享的 URL,指向你已经放在那里的项目。 publish 是一个很薄的客户端。它不编译、不打包,也不上传任何东西。它向平台发送一个带身份认证的请求,然后打印平台返回的那个 URL。

什么时候使用 publish

  • 给评审者发一个构建链接,而不是一个 zip 文件。
  • build 产出产物之后,把分享链接接进 CI。
  • 把分享链接固定到某一个特定构建,而不是项目的最新构建。
publish 解析的是一个已经存在于 extension.dev 上的项目,所以它需要平台已经记录过的构建。如果你想把此刻正躺在你自己 dist/ 里的构建发给别人,请改为上传那个构建:Share an unpublished build for review
publish 与 extension.dev 平台通信,而它是独立于 Extension.js 的另一个产品。那些在你本机运行的 Extension.js 命令(createdevbuildpreviewstart)从来不需要账号,publish 需要。

用法

被发布的项目取决于你的令牌被授权到哪个项目。路径参数不上传任何东西,它只是指明一个本地目录,下面的作用域检查会拿这个目录的项目名去比对。

令牌要求

没有访问令牌时,publish 拒绝运行。它按以下顺序在三个地方查找:
  1. 命令行上的 --token <token>
  2. 环境变量 EXTENSION_DEV_TOKEN(CI 中推荐用这个)。
  3. npx @extension.dev/mcp login 写下的已存储设备登录。
三者都没有时,命令会在发出任何网络请求之前以退出码 1 退出,并向 stderr 打印:
可以在 extension.dev 控制台或项目的 access-tokens API 创建令牌,文档见 Access tokens

作用域检查

一次已存储的设备登录只对应一个项目。从一个无关的目录发布,会为那个项目生成一个分享链接,而任何显眼的地方都不会写明它到底属于谁。publish 把这种不匹配当作拒绝,而不是警告:
  • 当目录的项目名与已存储登录的项目对不上时,命令拒绝执行,并把两者都列出来。
  • --project <slug>,就可以在任何位置有意地发布该登录对应的项目。
  • 传入的 --project slug 与已存储登录不匹配时,同样会被拒绝。
  • 使用 --tokenEXTENSION_DEV_TOKEN 提供的令牌时,会完全跳过与已存储登录的比对。
本地项目名依次取自 package.jsonmanifest.jsonsrc/manifest.json,最后才是文件夹名。

参数与 flag

它会打印什么

pretty 输出只有一行,就是分享 URL,因此可以干净地用在管道里:
--output json 打印一个信封。平台响应放在 value 里,而它携带的不只是那个 URL:
公开项目只会返回 value.shareUrlvalue.visibility,没有需要携带的令牌。 带上 --build-sha 时,URL 指向的是那个构建,而不是项目总览页:https://<workspace>.extension.dev/<project>/builds/<sha>

公开项目与私有项目

一个项目要么是公开的,要么是私有的。publish 只读取这个设置,从不修改它。你拿到哪种链接由平台决定: 两种回答指向的是同一个页面。可见性决定的是要不要附上令牌,而不是你拿到哪个地址。

固定到某一个构建

--build-sha 链接到某一个构建,而不是项目的最新构建。平台会拿这个 sha 去比对项目的构建索引,当没有任何已完成的构建匹配时,返回 404UNKNOWN_BUILD 代码,所以一个拼写错误会明确地失败,而不是产出一个指向错误产物的链接。

示例

在 CI 中发布

给某一位评审者的短期链接

行为说明

  • publish 从不编译。想让链接指向新鲜的输出时,请先运行 build
  • 每一条失败路径都以退出码 1 退出:令牌缺失、平台不可达,或任何非 2xx 响应——后者会打印为 publish failed (<status>): <message>
  • --api 接受带结尾斜杠或不带结尾斜杠的基础 URL。命令会自己补上 /api/cli/publish
  • --ttl 会被平台钳制在 1 到 168 小时的范围内。
  • 这个命令返回的 ?share= 令牌,不是那个可撤销的 30 天预览链接。那种链接来自另一个动作,它会上传构建;而 publish 什么都不上传。参见 平台的 publish 页面

下一步