【问题标题】:npm install from Git in a specific version从特定版本的 Git 安装 npm
【发布时间】:2012-12-20 17:03:03
【问题描述】:

假设我已经为 Node.js 编写了一个模块,我想保持私有。我知道我可以(应该)添加以下行:

"private": "true"

package.json文件,我也知道我可以npm install这个模块使用文件系统路径或git存储库的链接,包括GitHub。

我也知道我可以将这样的文件系统路径或 git repo 的链接放入package.json,这样dependencies 部分可能看起来像这样:

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

我现在想要的不是链接到最新版本,而是链接到特定版本。我知道的唯一可能性是使用其 ID 链接到特定提交。但这比使用诸如0.3.1 之类的版本号更不可读,更难维护。

所以我的问题是:是否可以指定这样的版本号并让 npm 在 git 存储库中搜索包含此版本的最新提交?

如果没有,您如何在您的项目中解决此问题?您是否使用提交 ID 或有更好的解决方案?

【问题讨论】:

    标签: node.js npm


    【解决方案1】:

    dependency 必须可从registry 获得,才能由specifying a version descriptor 安装。

    如果您的项目不应公开共享,您当然可以create and use your own registry 而不是registry.npmjs.org

    但是,如果它不在注册表中,则必须由 URLGit URL 引用。要使用 Git URL 指定版本,请在末尾包含适当的 <commit-ish>,例如标签,作为 URL fragment

    例如,对于名为 0.3.1 的标签:

    "dependencies": {
      "myprivatemodule": "git@github.com:...#0.3.1"
    }
    

    注意:上面的 sn-p 显示的基本 URL 与问题中发布的相同。

    应填写剪切部分(...):

    "myprivatemodule": "git@github.com:{owner}/{project}.git#0.3.1"
    

    而且,当 SSH 访问不可用时,将需要不同的地址格式:

    "myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"
    

    根据您的操作系统,您还可以 link 到另一个文件夹中的依赖项,您从 Github 克隆了该依赖项。

    【讨论】:

    • 似乎这篇文章中的一些链接已经过时了,因为它们导致了 404 页。很遗憾,因为其中一些是我一直在寻找的信息。
    • 我用git tag -a "1.0.0" 标记了一个特定版本并推送git push --tags,然后我在git+ssh 依赖项的末尾添加了#v1.0.0。但是npm update 没有任何反应。
    • @loretoparisi 对不起。我并不是要建议添加v 是必要的。在# 之后,fragment 应该与标签的全名(或其他commitsh)匹配——在你的情况下,#1.0.0
    • 截至 2016 年 7 月,托管自己的注册表变得更加复杂,因为它们正在从 couchdb 转移到微服务
    • 您现在可以使用npm i {owner}/{project}#{tag} 或将"{library}": "github:{owner}/{project}#{tag}" 添加到package.json,而不是使用git@github.comgit://github.com
    【解决方案2】:

    如果您使用多个模块执行此操作并希望对版本有更多控制权,您应该考虑拥有自己的私有 npm 注册表。

    通过这种方式,您可以将模块发布到您的私有 npm 注册表,并使用与公共模块相同的方式使用 package.json 条目。

    https://docs.npmjs.com/files/package.json#dependencies

    【讨论】:

    • 所有链接都是404
    【解决方案3】:

    接受的答案对我不起作用。这是我从 github 拉包的方法:

    npm install --save "git://github.com/username/package.git#commit"
    

    或者在 package.json 中手动添加:

    "dependencies": {
      "package": "git://github.com/username/package.git#commit"
    }
    

    【讨论】:

    • 如果您使用的是 http/https,请确保包含“git+”前缀:"package": "git+https://github.com/username/package.git#commit"
    • 这在“npm install”中有效,但是当我尝试运行我的应用程序时,require('mymodule') 找不到它的包。即使包位于 node_modules 目录中,具有相同的名称。
    • 哦,有问题的模块没有包含我想要的特定提交的构建,所以如果你有同样的问题,你可能需要手动构建它。
    • 你也可以使用#tag,它通常指向一个版本号
    • @surjikal 您需要先标记发布,然后才能在 git 中使用版本号。例如git tag -a v1.0.1 && git push --tag && git push @Jonathan Lonowski 在评论中也说过。
    【解决方案4】:

    如果版本是指标签或版本,那么 github 会提供这些的下载链接。例如,如果我想安装fetch 0.3.2 版本(在npm 上不可用),那么我在dependencies 下添加package.json

    "fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",
    

    与提交散列方法相比,唯一的缺点是散列保证不代表更改的代码,而标签可以被替换。幸好这种情况很少发生。

    更新:

    这些天来,我使用的方法是 GitHub 服务依赖项的紧凑表示法:

    "dependencies": {
      "package": "github:username/package#commit"
    }
    

    commit 可以是任何提交的东西,比如标签。对于 GitHub,您甚至可以删除初始的 github:,因为它是默认值。

    【讨论】:

    • 归档模式也适用于提交;例如,`纱线添加github.com/github/fetch/archive/…`
    • 最干净的解决方案。
    • 请注意,如果使用标签,则上面的commit 必须是准确的标签名称。当您使用 v3.0.0 标记您的发布时,您需要使用带有 v 前缀的确切标记。
    【解决方案5】:

    我对@qubyte above 的示例评论被截断了,所以这里有一些更容易阅读的内容...

    @surjikal 描述的方法 above 适用于分支提交,但不适用于我尝试包含的 tree 提交。


    归档模式也适用于提交。比如fetch@a2fbf83

    npm

    npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz
    

    纱线

    yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz
    

    格式

     https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz
    


    这是需要 /archive/ 模式的 tree 提交:
    yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz
    

    相关vuex commit

    【讨论】:

      【解决方案6】:

      此命令从特定的 git commit 安装 npm 包 username/package

      npm install https://github.com/username/package#3d0a21cc
      

      这里3d0a21cc是提交哈希的前8个字符。

      【讨论】:

        【解决方案7】:

        我在这里描述了我在运行 npm install 时遇到的一个问题 - 包没有出现在 node_modules 中。

        问题是已安装包的package.json 中的name 值与导入包的名称不同(我的项目的package.json 中的键)。

        因此,如果您安装的项目名称是 some-package(名称值在其 package.json 中),那么 在您项目的package.json 中写:"some-package": "owner/some-repo#tag"

        【讨论】:

        • 我希望我早点找到你的答案? - 我刚刚解决了,同样的问题让我挣扎了一段时间;而这个name 的要求在网上并不经常被提及..(至少我不会因此而受到影响)。
        • “将你的包依赖项添加到你的 package.json 中,指定完整的范围包名。” - 不是很强调它:help.github.com/en/articles/…
        • 我发现npm install --save git+https://&lt;remote-github-repo-url&gt; 是一种非常安全的方法,以后不会再遇到这个问题。
        【解决方案8】:

        我需要运行两个版本的tfjs-core,发现都需要在安装后构建。

        package.json:

        "dependencies": {
          "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
          "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
        }
        

        然后:

        cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
        cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../
        

        最后,使用库:

        import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
        import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';
        

        效果很好,但肯定是#hoodrat

        【讨论】:

        • 谢谢,我一直在尝试以其他可以想象的方式导入它。我必须看到你的 sn-p 才能意识到我必须直接从文件中导入。
        猜你喜欢
        • 2016-01-15
        • 2015-07-30
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多