npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

au_deploy

v1.0.9

Published

Automatically deploy the package to the server

Downloads

97

Readme

au_deploy

au_deploy 是一个基于 SFTP 的自动化部署命令行工具,用于把本地打包产物上传到服务器指定目录。

脚本会根据当前执行命令所在目录,自动推导本地打包产物路径和服务器发布目录。上传时会先把新版本传到 .uploading 临时路径,上传成功后再备份旧版本并切换到正式路径,尽量避免上传中断导致线上目录缺失或内容不完整。

执行命令后会先询问是否确认部署。输入 Yes(或 Y)后才执行后续逻辑;输入 No(或 N)会直接取消部署。

功能

  • 自动识别当前项目名,并上传对应的打包产物。
  • 执行部署前通过 Yes/No 进行人工确认。
  • 支持目录和单文件上传。
  • 上传前自动清理上一次残留的 .uploading 临时路径。
  • 已存在同名远端文件或目录时,会先重命名为备份。
  • 备份名格式为 原文件名.bakYYYYMMDD.HHMMSS,例如 au_deploy.bak20260707.125959
  • 自动清理 48 小时前的历史备份,近 48 小时内的备份会保留。
  • 目录上传显示文件数量进度,单文件上传显示字节进度。
  • 上传成功后输出页面访问链接。
  • 支持彩色日志输出,方便区分信息、成功、警告、错误和进度。
  • 支持通过 AU_DEPLOY_USERNAMEAU_DEPLOY_PASSWORD 环境变量传入服务器登录凭据,并优先于命令行参数。

安装

全局安装:

npm i au_deploy -g

项目内安装(开发依赖):

npm i au_deploy -D

如果发布 npm 时改成了 scoped package,例如 @your-scope/au_deploy,安装命令中的包名替换成实际包名即可。

使用

进入需要部署的项目目录后,根据安装方式执行对应命令。

请在源码项目目录中执行部署命令。工具会根据当前目录名和父级目录名推导本地打包产物及服务器发布目录。

全局安装后

推荐使用环境变量传入服务器用户名和密码:

au_deploy --host <host> --port <port>

示例:
au_deploy --host 120.25.233.113 --port 22

兼容旧用法,也可以通过命令行参数传入用户名和密码:

au_deploy --host <host> --port <port> --username <username> --password <password>

示例:
au_deploy --host 120.25.233.113 --port 22 --username h5_dev --password ******** 

不推荐长期使用 --password,因为命令参数可能出现在 Shell 历史记录或进程列表中。

项目内安装后

通过 npx 执行项目本地安装的命令:

npx au_deploy --host <host> --port <port>

示例:
npx au_deploy --host 120.25.233.113 --port 22

兼容旧用法,也可以通过命令行参数传入用户名和密码:

npx au_deploy --host <host> --port <port> --username <username> --password <password>

示例:
npx au_deploy --host 120.25.233.113 --port 22 --username h5_dev --password ******** 

两种安装方式支持的参数和环境变量完全一致。

参数说明

| 参数 | 必填 | 说明 | | --- | --- | --- | | --host | 是 | 服务器地址,也会用于生成最终访问链接 | | --port | 是 | SSH/SFTP 端口,通常为 22 | | --username | 否 | 服务器登录用户名;建议改用 AU_DEPLOY_USERNAME | | --password | 否 | 服务器登录密码;建议改用 AU_DEPLOY_PASSWORD |

环境变量

| 环境变量 | 说明 | | --- | --- | | AU_DEPLOY_USERNAME | 服务器登录用户名 | | AU_DEPLOY_PASSWORD | 服务器登录密码 |

macOS / Linux 可以临时这样使用:

配置环境变量

zsh(macOS 默认)

  1. 打开配置文件:

    nano ~/.zshrc
  2. 在文件末尾添加:

    export AU_DEPLOY_USERNAME='你的服务器用户名'
    export AU_DEPLOY_PASSWORD='你的真实密码'
  3. 保存并退出 nano:按 Control + O,按 Enter 确认,再按 Control + X

  4. 重新加载配置:

    source ~/.zshrc

bash

  1. 打开配置文件:

    nano ~/.bash_profile
  2. 在文件末尾添加:

    export AU_DEPLOY_USERNAME='你的服务器用户名'
    export AU_DEPLOY_PASSWORD='你的真实密码'
  3. 保存并退出 nano:按 Control + O,按 Enter 确认,再按 Control + X

  4. 重新加载配置:

    source ~/.bash_profile

如果还会直接启动交互式非登录 Bash,可将环境变量写入 ~/.bashrc,并在 ~/.bash_profile 中添加:

[ -f ~/.bashrc ] && source ~/.bashrc

这样环境变量只需保存在 ~/.bashrc 中,无需重复配置。

Windows

打开“高级系统设置”,进入“环境变量”,然后在“用户变量”中分别新建:

| 变量名 | 变量值 | | --- | --- | | AU_DEPLOY_USERNAME | h5_dev(或你的服务器用户名) | | AU_DEPLOY_PASSWORD | 你的真实密码 |

保存后重新打开命令提示符、PowerShell 或终端,使配置生效。

验证配置

不要使用 echo "$AU_DEPLOY_PASSWORD" 验证,否则密码会直接显示在终端中。

验证当前终端:

if [ -n "${AU_DEPLOY_PASSWORD:-}" ]; then
  echo "AU_DEPLOY_PASSWORD 已设置"
else
  echo "AU_DEPLOY_PASSWORD 未设置"
fi

也可以分别验证 zsh 和 bash:

zsh -ic '[[ -n ${AU_DEPLOY_PASSWORD:-} ]] && echo "zsh:已设置" || echo "zsh:未设置"'
bash -lc '[[ -n ${AU_DEPLOY_PASSWORD:-} ]] && echo "bash:已设置" || echo "bash:未设置"'

关闭并重新打开终端后再次验证,可确认配置在 Shell 重启后仍然有效。

删除环境变量

  1. 打开此前写入环境变量的配置文件,例如:

    nano ~/.zshrc
    # 或 nano ~/.bash_profile
    # 或 nano ~/.bashrc
  2. 删除以下配置行并保存:

    export AU_DEPLOY_USERNAME='你的服务器用户名'
    export AU_DEPLOY_PASSWORD='你的真实密码'
  3. 从当前终端中立即清除变量:

    unset AU_DEPLOY_USERNAME AU_DEPLOY_PASSWORD
  4. 重新加载修改过的配置文件,或关闭并重新打开终端。

  5. 验证密码变量已删除:

    if [ -z "${AU_DEPLOY_PASSWORD:-}" ]; then
      echo "AU_DEPLOY_PASSWORD 已删除"
    else
      echo "AU_DEPLOY_PASSWORD 仍然存在"
    fi

Windows 用户可在“高级系统设置”→“环境变量”→“用户变量”中删除对应变量,然后重新打开终端。

CI/CD 中建议把 AU_DEPLOY_USERNAMEAU_DEPLOY_PASSWORD 配置到平台提供的 Secret / Environment Variables 中,不要提交到代码仓库。

目录约定

脚本会以“执行命令时所在目录”为当前项目目录:

currentDirName = 当前目录名
parentName     = 当前目录的父级目录名

本地打包产物路径会根据父级目录名推导:

| 父级目录名 | 本地打包产物根目录 | | --- | --- | | skills | act_test | | act_dev | act_test | | page_dev | page_test |

例如当前执行目录是:

/project/act_dev/au_deploy

则脚本会尝试上传:

/project/act_test/au_deploy

服务器目标目录会根据父级目录名推导:

| 父级目录名 | 服务器目标目录 | | --- | --- | | skills | remote/h5/act | | act_dev | remote/h5/act | | page_dev | remote/h5 |

如果父级目录名不在上述配置中,脚本会直接报错,避免误上传到错误目录。

访问链接

上传成功后,脚本会输出访问链接:

访问链接:http://<host>/h5/<当前执行目录名称>/index.html

或:

访问链接:http://<host>/h5/act/<当前执行目录名称>/index.html

链接生成规则:

  • remote/h5 会转换为 /h5
  • remote/h5/act 会转换为 /h5/act
  • 当前执行目录名会作为页面目录名。
  • 最后固定拼接 index.html
  • 如果 --host 传入了 http://https://,脚本会去掉协议后再统一输出 http:// 链接。

例如当前目录名是 au_deploy--host120.25.233.113

remote/h5/au_deploy     -> http://120.25.233.113/h5/au_deploy/index.html
remote/h5/act/au_deploy -> http://120.25.233.113/h5/act/au_deploy/index.html

访问链接只会在上传成功后输出,上传失败时不会输出。

部署流程

假设当前项目名为 au_deploy,服务器正式路径为:

remote/h5/act/au_deploy

部署时流程如下:

  1. 校验本地打包产物是否存在。
  2. 连接服务器。
  3. 确保服务器目标目录存在。
  4. 列出目标目录第一层级内容,方便确认远端状态。
  5. 清理残留的临时上传路径,例如 remote/h5/act/au_deploy.uploading
  6. 上传新版本到 .uploading 临时路径。
  7. 上传成功后,清理 48 小时前的历史备份。
  8. 如果服务器存在同名正式路径,则重命名为备份,例如 au_deploy.bak20260707.125959
  9. .uploading 临时路径重命名为正式路径。
  10. 如果正式路径切换失败,脚本会尝试把刚才生成的备份恢复回正式路径。
  11. 上传成功后输出访问链接。

备份和清理规则

当服务器已存在同名文件或目录时,不会直接覆盖,而是先重命名为备份:

au_deploy -> au_deploy.bak20260707.125959

备份清理规则:

  • 只清理与当前上传目标同名的备份。
  • 只清理超过 48 小时的备份。
  • 近 48 小时内的备份会保留,方便回滚。

例如当前上传目标是 au_deploy,脚本只会处理类似下面的备份:

au_deploy.bak20260707.010135
au_deploy.bak20260707.010234

不会处理其他项目的备份文件。

上传进度

目录上传时,进度按已上传文件数量统计:

上传进度:3/20 (15%) 目标文件 -> remote/h5/act/au_deploy/index.html

单文件上传时,进度按字节大小统计:

上传进度:256.0KB/1.2MB (21%)

日志说明

脚本会输出彩色日志:

  • 青色:普通信息。
  • 绿色:连接成功、上传完成、访问链接等成功信息。
  • 黄色:备份、清理、切换等需要关注的操作。
  • 红色:错误信息。
  • 蓝色:上传进度。
  • 灰色:服务器目录列表。
  • 亮白色:本地路径、远端路径和访问链接。

注意事项

  • 请在源码项目目录中执行命令,不要在打包产物目录中执行。
  • 执行目录的父级目录名必须是 skillsact_devpage_dev
  • 服务器需要允许当前账号通过 SFTP 创建目录、上传文件、重命名和删除文件。
  • 访问链接默认使用 http://,如果线上实际使用 HTTPS,需要手动替换协议或后续扩展脚本配置。
  • AU_DEPLOY_USERNAMEAU_DEPLOY_PASSWORD 只存在于运行环境中,不应该写入 README 示例之外的真实凭据,也不要提交到 Git。
  • 如果部署中断,下次部署会先清理残留的 .uploading 临时路径。

常见问题

为什么推荐使用 AU_DEPLOY_PASSWORD

因为 --password 属于命令行参数,可能被 shell history 记录,也可能在命令运行期间通过进程列表看到。环境变量也不是绝对安全,但比把密码直接写在命令参数里更适合作为 npm CLI 的默认方案。

服务器没有同名文件时会发生什么?

脚本会输出新文件/目录提示,不会生成备份,上传完成后直接把 .uploading 临时路径切换为正式路径。

上传失败会影响线上目录吗?

如果失败发生在临时上传阶段,正式路径不会被移动。如果失败发生在最终切换阶段,脚本会尝试把刚刚重命名出来的备份恢复为正式路径。

为什么访问链接和服务器目录不完全一样?

服务器目录以 remote 作为发布根目录,但浏览器访问路径从 h5 开始。因此脚本会把 remote/h5 转成 /h5,把 remote/h5/act 转成 /h5/act

作者:龍