重要提示:此文档涵盖 Yarn 1(经典)。
有关 Yarn 2+ 文档和迁移指南,请参阅 yarnpkg.com。

为 Yarn 添加命令行别名

G. Kay Lee 于 2017 年 6 月 19 日发布

Yarn 的核心设计理念之一是努力追求简洁;精简的 CLI,没有冗余功能。这就是为什么 Yarn 一直抵制添加诸如 npm r 之类的随意内置速记法或类似于 Git 中的别名系统的缘故。我们认为,这些别名系统可能会为 Yarn 体验带来的好处并不能证明构建和维护这样一个成熟子系统所需的成本是合理的。

但我们也注意到,这是我们从社区收到的最常见的特性请求之一。人们出于多种原因使用别名,譬如复制他们在 npm 命令中的体验。好消息是,所有现代 Shell 环境实际上都以这种或那种形式支持命令别名,我们鼓励你利用已经针对你最喜爱的 Shell 内置的这些方式改进你的 CLI 体验。

假设你经常查看软件包分发标签信息,也是一条信息狂热爱好者同时又是表情符号憎恶者,而且你希望有一个方便的速记法来完成此项常用任务。下面我们已经编译了一份指令别名的添加方式清单 yarn info --verbose --no-emoji <package> dist-tags 以方便你在多种流行的 Shell 中使用

Bash 和 Zsh

Bash 是大多数类似 Unix 的系统上的默认 Shell;它与 Zsh 一同从早期的 Bourne Shell 衍生而来,因此语法在很大程度上是兼容的。要在 Bash 或 Zsh 中添加一个简单的别名,只需在你的 .bashrc.zshrc 中添加以下行,具体取决于你使用的是哪个 Shell

alias ynf="yarn info --verbose --no-emoji"

重新启动你的 Shell,现在你就可以执行以下操作

ynf react dist-tags
yarn info v0.24.6
verbose 0.261 Checking for configuration file "/Users/gsklee/.npmrc".
verbose 0.262 Checking for configuration file "/Users/gsklee/.npmrc".
verbose 0.262 Checking for configuration file "/Users/gsklee/.nvm/versions/node/v8.1.2/.npmrc".
verbose 0.263 Checking for configuration file "/Users/gsklee/.npmrc".
verbose 0.263 Checking for configuration file "/Users/.npmrc".
verbose 0.265 Checking for configuration file "/Users/gsklee/.yarnrc".
verbose 0.265 Found configuration file "/Users/gsklee/.yarnrc".
verbose 0.267 Checking for configuration file "/Users/gsklee/.yarnrc".
verbose 0.267 Found configuration file "/Users/gsklee/.yarnrc".
verbose 0.268 Checking for configuration file "/Users/gsklee/.nvm/versions/node/v8.1.2/.yarnrc".
verbose 0.268 Checking for configuration file "/Users/gsklee/.yarnrc".
verbose 0.268 Found configuration file "/Users/gsklee/.yarnrc".
verbose 0.27 Checking for configuration file "/Users/.yarnrc".
verbose 0.274 current time: 2017-06-16T09:43:50.256Z
verbose 0.339 Performing "GET" request to "https://registry.yarnpkg.com/react".
verbose 0.488 Request "https://registry.yarnpkg.com/react" finished with status code 200.
{ latest: '15.6.1',
  '0.10.0-rc1': '0.10.0-rc1',
  '0.11.0-rc1': '0.11.0-rc1',
  next: '16.0.0-alpha.13',
  dev: '15.5.0-rc.2',
  '0.14-stable': '0.14.9',
  '15-next': '15.6.0-rc.1' }
Done in 0.28s.

现在,如果你还想进一步将 dist-tags 部分也加到别名中,则你需要改用一个函数,因为 Bash/Zsh 别名不接受其他参数

function ynftag { yarn info --verbose --no-emoji "$@" dist-tags; }

然后,只需键入即可获得相同输出

ynftag react

Fish

Fish 是一个较新的“奇异 Shell”,偏离了传统的 Shell 设计。它提供的“缩写”可在键入过程中实时扩展为完整的命令,很像现代代码编辑器中的所谓代码片段。要添加一个缩写

abbr --add ynf yarn info --verbose --no-emoji

但是,在传入其他参数时,你必须使用函数,就像在 Bash 和 Zsh 中一样

function ynftag --wraps yarn --description "yarn info --verbose --no-emoji <package> dist-tags"
  yarn info --verbose --no-emoji $argv dist-tags
end

要使别命令定义持久存在,请将其保存到你的自动加载目录

funcsave ynftag

Windows PowerShell

PowerShell 是当前 Windows 版本中的默认 Shell。与基于文本处理和管道构建的 Unix Shell 不同,PowerShell 中的输入和输出是 .NET 对象;因此,PowerShell 中的别名不是作为字符串替换项使用,而是作为指向现有函数的指针。这意味着你无论是否涉及其他参数,都需要使用函数来定义自己的别名。

下面是一个 ynftag 别名的 符合准则的示例

function Get-NpmPackageDistributionTags { yarn info --verbose --no-emoji @Args dist-tags }
New-Alias ynftag Get-NpmPackageDistributionTags

这是一个 Yarn 别名,它重新添加了 ls 命令来列出包

# yarn broke 'ls'
# Scope private do we don't call yarn recursively!
function Private:yarn() {
	$modifiedArgs = @()
	foreach ( $arg in $args ) {
		if ( $arg -cmatch '^ls$' ) {
			$arg = 'list'
		}
		$modifiedArgs += $arg
	}
	& yarn $modifiedArgs
}

将上述代码保存到你最合适的某个 PowerShell 配置 中,以便使定义持久存在。

命令提示符 (cmd)

如果您仍在使用笨拙的命令提示符,我们相信,从长远来看,您最好学习使用 PowerShell。它的功能更强大,更现代,而且所有内容都更加一致。不过,以下是您在当前命令提示符实例中定义别名的方式

doskey ynftag=yarn info --verbose --no-emoji $* dist-tags

由于命令提示符没有类似于 .bashrc 的内容,因此为了永久保存您的别名,您需要在主目录中创建一个自定义 cmdrc.cmd 文件(可以是任何名称,但我们建议您坚持使用传统的命名约定),其内容如下

@echo off
doskey ynftag=yarn info --verbose --no-emoji $* dist-tags

然后,修改命令提示符快捷方式目标为

# Replace `cmdrc.cmd` with the full path that leads to the file.

cmd.exe /k cmdrc.cmd

总结

Yarn 是一个强大的 JavaScript 工具,但它也是驻留在您的 Shell 环境中的工具。通过利用 Shell 的固有功能,Yarn 立即可为您做更多事情。