news 2026/9/13 4:27:46

dub CLI 如何完成本地构建、npm link 与 dub login 首次登录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dub CLI 如何完成本地构建、npm link 与 dub login 首次登录

dub CLI 如何完成本地构建、npm link 与 dub login 首次登录

【免费下载链接】dubThe modern link attribution platform. Loved by world-class marketing teams like Framer, Perplexity, Superhuman, Twilio, Buffer and more.项目地址: https://gitcode.com/GitHub_Trending/du/dub

如果你需要脱离 dub.co 网页控制台、在终端里直接调用 Dub API 创建短链,就要用到dub-cli——dub 仓库packages/cli目录下提供的命令行工具。它通过 OAuth 登录 Dub 平台,把访问凭据保存在本地,之后就能用dub命令执行loginconfigdomainsshortenlinks等子命令。

本文覆盖的任务是:在本地把dub-cli构建出来,通过npm link注册为全局dub命令,完成dub login首次登录,并验证登录是否真正生效。依据是仓库中的 packages/cli/README.md 及其指向的源码。

准备条件

  • 项目使用 pnpm 工作区管理(根目录有 pnpm-workspace.yaml),先在仓库根目录安装依赖,再进入 CLI 包目录。
  • packages/cli/package.json 中定义了构建与运行脚本,这也是后文所有pnpm命令的来源:
脚本实际命令用途
devtsup --watch监听模式构建,开发时使用
buildtsup一次性构建产物
startnode dist/index.js直接以 Node 运行构建产物

构建产物输出到packages/cli/dist/index.js,即 tsup.config.ts 中的outDir: "dist",入口为src/index.tspackage.jsonbin字段把dub命令映射到./dist/index.js,所以npm link之后全局可用的就是dub

构建并 link:让dub命令全局可用

packages/cli/README.md 的 “Testing Production-like Setup” 章节给出了主路径。开始前先注意文档中的警告:如果之前已全局安装过dub-cli,先卸载它,避免冲突

  1. 克隆仓库、安装依赖后进入 CLI 目录:

    cd packages/cli
  2. 构建包:

    pnpm build
  3. 将包 link 到全局:

    npm link
  4. 验证安装,确认dub命令可执行并输出版本号(-v, --version选项在 src/index.ts 中注册):

    dub -v
  5. 之后即可在任意目录运行子命令:

    dub [command]

可选分支:如果只是想边改代码边调试,不需要npm link。README 的 “Running Locally for Development” 章节的做法是在一个终端运行pnpm dev(即tsup --watch,持续重新构建),在另一个终端运行pnpm start [command]执行命令,用pnpm start help查看全部可用命令。这条路径只服务于开发调试,不产生全局dub命令。

dub login:OAuth 浏览器登录流程

dub login的作用是登录 Dub 平台。看 packages/cli/src/commands/login.ts 的实现,它执行时会做三件事:

  1. 生成一个codeVerifier,并固定回调地址为http://localhost:4587/callback
  2. 通过 OAuth 授权码流程(oauthClient.authorizationCode.getAuthorizeUri,申请links.readlinks.writedomains.read三个 scope)拿到授权 URL,然后调用open包自动打开浏览器;
  3. 启动本地回调服务等待授权结果。

回调服务在 packages/cli/src/api/callback.ts 中:它监听4587端口,收到/callback?code=...后换取accessTokenrefreshTokenexpiresAt,写入本地配置,最后终端会打印绿色的Logged in successfully!,浏览器页面显示Authentication successful! You can close this window.

所以执行首次登录的操作就是:

dub login

然后跟随浏览器中弹出的授权页完成登录授权即可。两个值得知道的边界,均来自源码:

  • 如果回调请求缺少code参数,服务会返回 400 并提示Authorization code not found. Please start the login process again.,需要重新运行dub login
  • 回调服务设置了 300 秒(setTimeout(..., 300000))的超时,超时后进程直接退出,此时同样需要重新开始登录。

验证登录是否生效

登录成功与否不能只看终端提示,可以从两处核对:

  1. 本地配置文件setConfig使用Configstore("dub-cli")持久化凭据(见 packages/cli/src/utils/config.ts),写入的字段包括access_tokenrefresh_tokenexpires_atlogin流程还会带上domain: "dub.sh"。运行下面命令可以查看当前配置的 workspace 凭据(config子命令会打印这份配置的 JSON):

    dub config

    dub config成功时终端显示Configuration file successfully retrieved并输出带颜色的 JSON 凭据。

  2. 未登录时的报错行为。所有依赖凭据的命令都会先调用getConfig();如果本地还没有任何配置,会抛出:

    Access token not found. Please run `dub login` to authenticate with Dub.

    也就是说,如果你跳过登录直接运行dub shorten等命令,看到这条报错就按提示先dub login。另外getConfig内置了过期处理:当expires_at已过时,它会用refresh_token自动刷新并写回新凭据,不需要手动重新登录。

登录后的首个操作:创建一个短链

首次登录的最终目的是能用 CLI 干活。以创建短链为例,packages/cli/src/commands/shorten.ts 支持两种用法:

dub shorten https://example.com my-key

即直接传入目标 URL 和短链 key;不传参数时则进入交互式提示,依次询问Destination URLShort link(key 会预填一个随机值)。创建成功后终端显示New short link created!并以绿色打印生成的短链;失败时显示Failed to create link并抛出错误。

README 中列出的其余命令可在登录后按需使用:dub domains配置 workspace 域名,dub links -s <search>按名称搜索链接,dub links -l <limit>限制返回条数(默认 10),dub help [command]查看具体命令的帮助。

到这里,本地构建、全局 link、首次登录这条路径就完整了:pnpm build+npm linkdub命令可用,dub login完成 OAuth 授权并落盘凭据,dub config能读到凭据即代表登录生效,之后的dub shorten等操作都会自动复用(并在过期时刷新)这份配置。

【免费下载链接】dubThe modern link attribution platform. Loved by world-class marketing teams like Framer, Perplexity, Superhuman, Twilio, Buffer and more.项目地址: https://gitcode.com/GitHub_Trending/du/dub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 4:27:17

CloddsBot:名称解析与技术实体确认指南

我无法基于当前输入生成符合要求的博文内容。原因如下&#xff1a;输入中仅提供了项目标题"CloddsBot"&#xff0c;以及相关热搜词和空的网络搜索内容&#xff08;三组反引号内无任何实际信息&#xff09;&#xff1b;缺少【项目正文】、【关键词】、【摘要描述】等核…

作者头像 李华
网站建设 2026/9/13 4:25:53

LunaTranslator:Galgame 实时翻译,从安装到出字的操作笔记

LunaTranslator&#xff1a;Galgame 实时翻译&#xff0c;从安装到出字的操作笔记 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator 你双击启动了一款全日 Galgame&#xf…

作者头像 李华
网站建设 2026/9/13 4:21:15

从零搭建Text-to-SQL最小闭环:Python+大模型+SQLite实战指南

很多人在接触大模型之后&#xff0c;第一个想做的落地小项目就是 Text-to-SQL&#xff0c;核心诉求很直接&#xff1a;我连 SQL 都不用写&#xff0c;把问题描述给大模型&#xff0c;它把 SQL 给我&#xff0c;我拿去执行&#xff0c;结果就出来了。听起来很爽&#xff0c;但真…

作者头像 李华
网站建设 2026/9/13 4:17:03

C/C++宽字符处理:wchar_t与_T()宏详解

1. wchar_t基础解析wchar_t是C/C中用于表示宽字符(wide character)的数据类型&#xff0c;它被设计用来支持扩展字符集。与普通的char类型(通常为8位)不同&#xff0c;wchar_t的大小取决于具体实现&#xff1a;在Windows平台上&#xff0c;wchar_t通常是16位(2字节)&#xff0c…

作者头像 李华
网站建设 2026/9/13 4:15:32

Python内置sqlite3实战:从建库到百万数据稳定写入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华