【问题标题】:How to get the version of a remote npm package using a bin script如何使用 bin 脚本获取远程 npm 包的版本
【发布时间】:2022-08-14 02:15:55
【问题描述】:

我正在尝试设置一个 npx 脚本来创建一个模板项目。

package.json 我有:

\"bin\": {
  \"init\": \"bin/init\"
}

init 脚本中,我使用tag=\'v\'$(npm pkg get version | tr -d \'\"\') 来获取包的版本。然后我使用git clone --depth 1 --branch $tag https://github.com/matriarx/typescript.git 为该特定标签克隆该特定存储库。

当我执行yarn link 并尝试在该特定项目中在本地使用它时,它可以正常工作,因为它能够正确获取package.json 版本。所以上面的方法只有在现有项目中运行时才有效。然而那不是我想要做的。

我想让某人即使在本地没有任何东西也可以运行它,只需执行npx @matriarx/typescript init 并且它应该通过克隆它来创建新项目。不仅如此,我希望他们能够使用npx @matriarx/typescript@0.0.1 init 克隆任何特定版本,以便克隆特定版本。

然而,似乎我尝试的任何东西都只能从已经存在的本地 package.json 获取版本。

我可以在不指定任何标签的情况下克隆当前现有的存储库,但这会破坏发布的意义,然后它只会克隆任何当前的代码,完全不考虑发布。所以它必须克隆标记的版本。

如何从 bin 脚本获取存储在 npm 上的远程包版本,而无需事先在本地获取任何内容?

或者有没有更好的方法来做我想做的事情?

编辑:我最终只是在脚本中对版本进行了硬编码,这很有效,但很糟糕,因为每次更新版本时都必须更新它很乏味。虽然现在我仍然不知道更好的方法来做到这一点。

    标签: npm


    【解决方案1】:

    经过一段时间的折腾,我发现有一种标准的方法可以做到这一点,至少从 npm 7 开始。

    如果您有一个像example 这样的项目,那么您可以使用bin 脚本创建一个名为create-example 的完全独立的项目。

    当你使用npm init example 时,npm 会自动搜索以“create-”为前缀的包,并执行其主 bin 脚本。因此,当运行npm init example 时,它将搜索create-example 包并执行bin 脚本,该脚本将安装example 包。

    这就是大多数较大的软件包(例如 react 和 next)的方式。

    这种方法有一些我真的不喜欢的缺点,例如它会显示对 npm 的不正确依赖关系,并且会导致您必须在不同的项目上维护多个项目和 semvers。但是,它还允许您在实际项目和该项目的安装之间创建一个干净的分离。

    对于某些项目,它也可能更有意义。例如,如果您有一个根本没有 package.json 的项目并且您想为其创建一个设置,那么仅仅为此在该项目中创建一个 npm 包是没有意义的。相反,您可以创建一个单独的“create-project”包来设置它并将 npm 排除在实际项目之外。换句话说,它为您提供了一种为完全独立的项目创建 bin 脚本的简洁方法,该项目与 npm 没有任何关系。

    您也可以创建一个普通的 shell 脚本并使用 curl 执行它,但我猜 npm 只是为您提供了另一种方法。使用 npm 的优点是它允许您自动管理版本以及它,因为如果您只是使用 curl 拉取它,那么它会拉取最新的而不是特定的标签。

    您仍然必须对“create-project”包中的版本进行硬编码,我仍然没有看到一种从远程包中自动确定版本的方法。我设法做到这一点的唯一方法是完全下载包,获取版本,然后删除它,但这对于互联网连接速度较慢或数据有限的人来说是可怕的。

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2019-05-07
      • 2018-07-14
      • 2019-10-25
      • 1970-01-01
      • 2020-12-23
      相关资源
      最近更新 更多