<p>纱线相当于 npx ?</p>

创建于 2017-07-15  ·  35评论  ·  资料来源: yarnpkg/yarn

纱线如何推荐我们使用 npx(现在是 npm 的核心部分 - https://github.com/npm/npm/pull/17685)。

基本上,它有点像 ruby​​ 的“bundle exec”,除了它在缺少依赖项时启动包管理器。 这将避开 yarn 并切换回 npm。

是否有计划创建一个“ypx”等价物来利用纱线来做到这一点?

cat-feature

最有用的评论

@sandys - @zkat引用的问题 (npm/npm#6053) 不是yarn的问题,因为你可以只做yarn x (或者yarn run x如果你想成为显式)如果x在您的./node_modules/.bin目录中。 所以我不认为有对npx等效性的迫切需要。

如果你认为有强烈的需求,你能解释一下你为什么需要它吗? 例如。 它会为你解决什么问题?

所有35条评论

就其价值而言,我认为 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@1ypx 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行为的扩展,因为您可以:

  1. 运行当前目录下./node_modules/.bin/中本地包的命令
  2. 如果本地不存在该包或./node_modules/目录不存在,请将该包及其依赖项下载到临时目录中并调用该命令

这是对用户透明的。

假设的ypx还可以提供第三点,即:

  1. 如果包在本地不存在并且存在于纱线缓存中并且与最新版本匹配,则使用缓存调用命令而不是下载所有包

@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 问题是:

  1. 它每次都下载缺少依赖项的包,
  2. 它在面向 Yarn 的项目中创建 package-lock.json,这会导致警告并需要手动删除它。
    (特别是我刚刚执行了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 问题是:

  1. 它每次都下载缺少依赖项的包,
  2. 它在面向 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已经存在(与您建议的含义不同)🙂

新的yarn dlx解决了这个问题?

抄送@sandys @arcanis

https://yarnpkg.github.io/berry/cli/dlx

是的! 暂时关闭这个问题,我还没有弄清楚我们是否想要将该功能向后移植到 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 ? 如果没有,那么它不能解决这个问题。

纱线创建 & npx & npm init

演示

https://www.npmjs.com/package/create-react-app

$ yarn create react-app

$ npx create-react-app

$ npm init react-app

image

https://www.npmtrends.com/npm-vs-npx-vs-yarn

image

@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 :

此页面是否有帮助?
0 / 5 - 0 等级