从github repo子文件夹安装npm包

kxkpmulp  于 11个月前  发布在  Git
关注(0)|答案(6)|浏览(135)

如果npm包位于子文件夹中,可以从github安装吗?
例如,我们有Microsoft BotBuilder存储库:https://github.com/Microsoft/BotBuilder
但是我需要在子文件夹“Node/core/"中安装软件包:https://github.com/Microsoft/BotBuilder/tree/master/Node/core/
如何使用npm安装它?

pzfprimi

pzfprimi1#

将子文件夹的github链接粘贴到gitpkg中。然后您可以使用此沿着yarn或npm从github子文件夹安装软件包。
https://gitpkg.now.sh/

btxsgosb

btxsgosb2#

添加到package.json

...
"scripts": {
  "postinstall": "mkdir BotBuilder; cd BotBuilder; git init; git remote add -f origin https://github.com/Microsoft/BotBuilder.git; git config core.sparseCheckout true; echo \"Node/core\" >> .git/info/sparse-checkout; git pull --depth=1 origin master; cd ..; npm i ./BotBuilder/Node/core/"
  ...
},
...

字符串
安装软件包后,postinstall脚本正在运行。
一步一步来:
1.将文件夹设置为克隆存储库:mkdir BotBuilder
1.进入文件夹:cd BotBuilder

  1. init git repo:git init
    1.将git origin设置为Microsoft/BotBuilder repo:git remote add -f origin https://github.com/Microsoft/BotBuilder.git
    1.启用sparse checkoutgit config core.sparseCheckout true
    1.将Node/core添加到结帐列表:echo "Node/core" >> .git/info/sparse-checkout
  2. pull部分repo:git pull --depth=1 origin master
    1.进入您的应用程序文件夹:cd ..
    1.安装BotBuilder:npm i ./BotBuilder/Node/core/
fnvucqvd

fnvucqvd3#

如果包源托管在GitHub上,则可以像这样使用GitPkg

# using npm:
npm install https://gitpkg.now.sh/<user>/<project>/<subdir>?<commit-ish>
# using yarn:
yarn add https://gitpkg.now.sh/<user>/<project>/<subdir>?<commit-ish>

字符串
对于您的特定情况,URL将是这样的:

https://gitpkg.now.sh/Microsoft/BotBuilder/Node/core?master


在他们的site上有一个很好的类似向导的表单,可以帮助构建URL,以及安装它的命令。

bq8i3lrv

bq8i3lrv4#

受到@Tomasz Jakub Rup的回答的启发。我更新了他的示例,并指出了他的示例所基于的3.0分支,并使用了新的git功能sparse-checkout。该功能将节省保存时间/带宽,因为它不需要提前克隆整个存储库,只会抓取您指定的内容。然而,许多服务器不支持--filter选项可以节省大量空间,但--depth 1在许多情况下仍然会减少带宽。
我使用了一个.tmp_npm文件夹来最小化文件夹,也可能是.gitignored,因为它是一个隐藏文件。

"scripts": {
  "postinstall": "mkdir .tmp_npm; cd .tmp_npm; git init; git clone --filter=blob:none --no-checkout --depth 1 --sparse -b 3.0 https://github.com/Microsoft/BotBuilder.git; cd BotBuilder/; git sparse-checkout init --cone; git sparse-checkout add Node/core; git checkout; cd ../..; npm i .tmp_npm/BotBuilder/Node/core/"
  ...
},

字符串

jm81lzqq

jm81lzqq5#

可能有点跑题,但还是和问题有关
https://git-scm.com/book/en/v2/Git-Tools-Submodules
Git Submodules是可以在其他仓库中使用的git仓库(以下简称为Supermodules)。每个子模块都有通常的分支功能和标签,其好处在于每个超级模块都是一个版本控制的可插拔组件,可以单独使用或与超级模块一起开发。

  • 一些有用的命令 *

要添加子模块,请在超级模块中运行以下命令:

git submodule add <url-to-submodule-repo>

字符串
子模块仍然需要初始化并从repo中获取:
第一个月
一个带有子模块的超模块可以被克隆,所有的子模块可以通过运行以下命令获取:
git clone --recursive <url-to-supermodule>
通过在子模块目录中运行以下命令,可以将上游更改拉到子模块的分支:
git fetch
然后运行以下命令更新本地代码:
git merge
下面的代码将获取和合并你的超级模块中的所有子模块:
git submodule update --remote
如果你想跟踪一个子模块的特定分支,你可以使用以下方法:
git config -f .gitmodules submodule.<my-submodule>.branch fantastic_new_implementation
如果你已经处理了你的超模块和子模块,并且你推送了你的超模块,对子模块所做的更改将只存在于本地,而那些你正在协作的人将不知道这些更改。
git push --recurse-submodules=check
最后,这里是一个有用的ForEach命令,它允许我们为每个子模块运行一个命令
git submodule foreach 'git checkout -b featureA

tez616oj

tez616oj6#

如果GitPkg对你不起作用,npm有一个很棒的功能,叫做'workspaces',从v7开始。这些是你从主仓库的子文件夹管理,部署等的朋友。它们允许你为你的子文件夹定义一个npm身份,并使它在本地仓库和其他仓库中都能使用npm install
定义你的工作区就像定义一个包所在的文件夹一样简单。用你的GitHub org命名它,我们称之为'@ namespace'。把你的package-name子文件夹放在里面,然后在repo root的package.json中添加一行:

"workspaces": ["@namespace/package-name"],

字符串
然后,运行npm init -w @namespace/package-name在子文件夹/workspace中创建一个package.json。(-w标志将您的工作空间定义为npm命令的“scope”。)
最后,运行npm install,所有这些魔术将导致根项目的node_modules现在作为依赖项符号链接到该工作区子文件夹。现在您可以开始使用import { thing } from '@namespace/package-name'引用您的工作区代码,就像任何其他依赖项一样。
但是,你的真实的目标是将它发布到 * 其他 * 项目中,对吗?好吧,对于本地开发,你可以通过引用该工作区,从本地机器上的repo进行npm安装,例如(对于兄弟文件夹):npm i -D ../repo-name/@namespace/package-name
但是,当你超越本地开发时呢?当你需要在CI中安装依赖项以进行部署时,或者让开发人员安装而不需要容纳包的整个repo时呢?为此,你需要一个npm兼容的包目录。当然,你可以使用npmjs.com目录,如果你的repo是公开的,它是免费的。你只需要从那个工作区子文件夹发布npm publish -w @namespace/package-name。如果你的repo是私有的,发布到npmjs.com需要付费。
新的黑马选项:特别是如果你已经使用付费GitHub计划,你可以免费发布到GitHub包并从GitHub包安装。GitHub Packages docs将详细介绍这一点,但基本上都归结为使用.npmrc来定义哪个注册中心可以控制你在package.json中定义的@命名空间。将这一行放在包含工作区的home repo中的.npmrc中,以及所有其他想要安装workspace包的repos:

@namespace:registry=https://npm.pkg.github.com


尽管如此,npm将知道从GitHub Packages发布或安装@namespace中的任何依赖项。并且您将无需额外费用即可完成子文件夹的发布。
(Note:GitPkg是一个很棒的社区服务,我在使用GitPkg/GitHubPackages之前尝试过它。然而,它是一个忙碌忙碌的研究生的副项目,目前有很多像我这样的用户报告了500个错误,他们由于某种原因无法使用他们的repo。如果它对你有用,那就太好了,但否则上面的方法就可以完成它,而且可能更具可扩展性。)

相关问题