纱线如何推荐我们使用 npx(现在是 npm 的核心部分 - https://github.com/npm/npm/pull/17685)。
基本上,它有点像 ruby 的“bundle exec”,除了它在缺少依赖项时启动包管理器。 这将避开 yarn 并切换回 npm。
是否有计划创建一个“ypx”等价物来利用纱线来做到这一点?
就其价值而言,我认为 npx 的灵感来自“yarn create”,它类似但仅适用于以“create-”为前缀的包。 不知道这里有什么计划。
是的,我们目前有yarn create
(例如,尝试使用yarn create react-app
)。 将来我们可能会向其他动词开放它,但这还没有在路线图上。
我正在研究图书馆化 npx。 获取现有的 npx 代码并仅用与纱线等效的命令替换与 npm 相关的内容并不是一项艰巨的任务。
我不会将它直接添加到 npx 本身,因为它_意味着_是不可知的:npx 不执行与使用其他包管理器的人发生冲突的操作。 它甚至不需要 npm 在系统上,所以你可以npm rm -g npm
并且 npx 会工作得很好。 所以你可以说 npx _is_ ypx
,除非你对缓存共享有强烈的感觉,这是一件很好的事情。
(重新灵感:npx 的主要灵感来自这个长期存在的功能请求:https://github.com/npm/npm/issues/6053。它的大部分功能都围绕满足 _this_ 需求。添加了自动安装功能 _was_ post-yarn-create,并且绝对旨在成为该特定事物的实际通用解决方案 - 但它确实_方式更多_)
@sandys - @zkat引用的问题 (npm/npm#6053) 不是yarn
的问题,因为你可以只做yarn x
(或者yarn run x
如果你想成为显式)如果x
在您的./node_modules/.bin
目录中。 所以我不认为有对npx
等效性的迫切需要。
如果你认为有强烈的需求,你能解释一下你为什么需要它吗? 例如。 它会为你解决什么问题?
有谁知道yarn exec
是否类似于bundle exec
? 我在 CLI 上看到它,但在网站上的文档中没有看到。 在命令行上快速使用yarn exec
似乎运行已安装的二进制文件,因此它可能会解决您的问题@sandys。
FWIW, npm-run是一种较旧的实用程序,它允许运行本地node_modules
二进制文件,并且它不依赖于npm
。 但是它没有任何选项,而npx
充满了旋钮。
@BYK用例在 CI 上运行例如ypx greenkeeper-lockfile@1
或ypx danger@2
而不将它们作为 deps 添加到项目本身
@SimenB CI 通常不会将项目提交回版本控制,所以它是否在流程中添加依赖关系并不重要,对吧?
@MarkBennett由于yarn exec
不从package.json
运行脚本,我认为它不是添加此功能的正确位置。
@BYK我不是 OP,但我提出此功能请求是因为我的本地机器上有一个包,但我的 package.json 中没有。 因此,我的应用程序会为我运行,但不适用于全新安装我的应用程序的任何人。 这是我喜欢 ruby bundler 的bundle exec
一个特性——除非所有的 deps 都在清单中,否则它不会运行。
我对yarn x
主要抱怨是它试图从 3(三)个不同的地方解析目标:yarn 内部命令、npm 脚本和 bin。
假设我有一个名为check
二进制工具:1) yarn check
将运行它自己的内部check
命令 2) yarn run check
将运行消费者的 npm具有这样名称的脚本或可能是我的工具。
npx
给出了强烈的概念分离: yarn x
始终是内部命令, yarn run x
始终是脚本,而npx x
始终是二进制文件,不需要猜测和希望。
像要点一样的东西
#!/usr/bin/env bash
package_name=$1
temp_dir="/tmp/ypx/$package_name/$(date +%s%N)"
mkdir -p $temp_dir
(cd $temp_dir; yarn add $package_name) && (PATH="$temp_dir/node_modules/.bin":$PATH; "$@")
rm -rf $temp_dir
@BYK另一个用例正在运行一个尚未在本地安装的包的 _binary_,我想运行它一次,之后又不想自己删除它。 npx
函数是yarn x
行为的扩展,因为您可以:
./node_modules/.bin/
中本地包的命令./node_modules/
目录不存在,请将该包及其依赖项下载到临时目录中并调用该命令这是对用户透明的。
假设的ypx
还可以提供第三点,即:
@BYK它不起作用。
安装babel-cli
例如: yarn add babel-cli
然后运行yarn babel-node --presets es2015 ./server.js
其中server.js
是当前目录下的一个文件,是一个简单的express
api 服务器。
它根本不起作用,并说该文件不存在。 ( Error: Cannot find module
)
但是将它与npx
使用npx babel-node --presets es2015 ./server.js
@BYK据我所知, node_module/.bin/
上查找您的命令,如果没有找到正确的命令,它将从网络获取软件包(如果有的话)并且您可以始终保持最新状态.
纱线未安装在本地机器上时,不会从网络获取包。
我们能得到一个yarnx
吗?
@light24bulbs为什么特别?
坦率地说,我认为npx
是一个很好的工具,即使有点过于以“npm inc.”为中心(公平地说,就像许多 npm 工具一样)。 yarnx
不会解决这个问题(它必然是以纱线为中心的),所以我不太确定这会是一个好主意。
理想情况下,我更喜欢npx
自动检测要使用的包管理器,或者至少允许在 rc 文件中配置它。 我建议把这个问题带给他们,看看他们怎么说。 根据他们的回答,我们将能够进行知情讨论🙂
@arcanis npx本身与 npm 组合在一起,因为它与 npm 捆绑在一起—— libnpx
不是,事实上,这就是 pnpm 中的pnpx
使用的。 我添加了几个补丁以使 Zoltan 成为可能。 我不会添加自动检测支持,因为它删除了一些集成并使事情变得更加复杂和难以支持:)
刚刚在谷歌上搜索了这个问题,我认为这是询问任何更新的合适地方。 是否有任何现有的工具/解决方案,或计划为纱线添加一些功能?
例如,我当前的 npx 问题是:
npx gatsby new blog https://github.com/gatsbyjs/gatsby-starter-blog
)这两个问题看起来都非常适合解决像@phra已经作为他的第三点提到的纱线。
UPD:所以基本上我提到的ypx
主要原因不是二进制执行(这对 yarn 来说完全没问题),而是自动下载我打算执行的包的能力。
我同意。 我也认为有机会改进 NPM 奇怪的 API
一点点。 我认为调用yarn exec COMMAND
会比调用更有意义
yarnx
。 Ruby bundler 有一个非常相似的命令
https://bundler.io/man/bundle-exec.1.html
2018 年 12 月 17 日星期一下午 2:29 Pavel Prokudin通知@ github.com
写道:
刚刚在谷歌上搜索了这个问题,我认为这是询问的合适地方
任何更新。 是否有任何现有的工具/解决方案,或计划添加一些
纱线的功能?
例如,我当前的 npx 问题是:
- 它每次都下载缺少依赖项的包,
- 它在面向 Yarn 的项目中创建 package-lock.json 导致
警告,需要用手将其移除。
(具体我只是执行 npx gatsby new blog
https://github.com/gatsbyjs/gatsby-starter-blog)这两个问题看起来都是解决像@phra 这样的纱线的完美匹配
https://github.com/phra已经提到他的第三点。—
你收到这个是因为你被提到了。
直接回复本邮件,在GitHub上查看
https://github.com/yarnpkg/yarn/issues/3937#issuecomment-447968558或静音
线程
https://github.com/notifications/unsubscribe-auth/AAjhEng6juvpaK4xLx1KrVHccJAytnAfks5u5_CcgaJpZM4OY9aL
.
——
-福雷斯特
yarn exec
已经存在(与您建议的含义不同)🙂
是的! 暂时关闭这个问题,我还没有弄清楚我们是否想要将该功能向后移植到 v1(可能不会?)。
我不确定它是否值得替代。 yarn dlx eslint --help
在我的机器上需要 2.7 秒,而npx eslint --help
在 0.2 秒内完成。 如果调用大量 bin 脚本,这将很快累积到不可接受的值。
另外,我认为除非出现错误,否则不应该通过 yarn 写入 stdout/stderr,以允许解析脚本的输出。
@silverwind时间差异似乎很明显。 这是否可以在多次运行中一致重现? 如果是,我会提交一个新问题进行调查,因为我们肯定不希望它变慢。
关于 Yarn 的 stdout/stderr,我_认为_你可以使用yarn --silend dlx eslint
来抑制所有非关键的 Yarn 输出。 @arcanis你能确认最后一个吗?
@light24bulbs为什么特别?
对于所有在网上找到一些包的人,看到安装说明涉及npx something something
,但想留在纱线世界。
新的
yarn dlx
解决了这个问题?
为yarn dlx
确切的s/npx/yarn dlx/
落更换为npx
? 如果没有,那么它不能解决这个问题。
演示
https://www.npmjs.com/package/create-react-app
$ yarn create react-app
$ npx create-react-app
$ npm init react-app
@light24bulbs - 回应@rulatir ,我来到这里是因为Storybook 的快速入门指南说要使用npx
来安装它,而且我没有一个简单的方法来说明如何使用yarn
等效咒语
我也和@codekiln 在同一条船上。 每当我按照一些说明运行npx ...
,我都不知道yarn
等价物是什么。 一个例子是npx tslint-to-eslint-config 。
@light24bulbs - 回应@rulatir ,我来到这里是因为Storybook 的快速入门指南说要使用
npx
来安装它,而且我没有一个简单的方法来说明如何使用yarn
等效咒语
同这里,有capacitorjs安装指南https://capacitorjs.com/docs/getting-started ,感觉就是这样劝用户放弃yarn,回到npm
我猜@delanym 的意思是这个页面(但我不认为这会复制npx
): https :
最有用的评论
@sandys - @zkat引用的问题 (npm/npm#6053) 不是
yarn
的问题,因为你可以只做yarn x
(或者yarn run x
如果你想成为显式)如果x
在您的./node_modules/.bin
目录中。 所以我不认为有对npx
等效性的迫切需要。如果你认为有强烈的需求,你能解释一下你为什么需要它吗? 例如。 它会为你解决什么问题?