如果npm包位于子文件夹中,可以从github安装吗?
例如,我们有Microsoft BotBuilder存储库:https://github.com/Microsoft/BotBuilder
但是我需要在子文件夹“Node/core/"中安装软件包:https://github.com/Microsoft/BotBuilder/tree/master/Node/core/
如何使用npm安装它?
如果npm包位于子文件夹中,可以从github安装吗?
例如,我们有Microsoft BotBuilder存储库:https://github.com/Microsoft/BotBuilder
但是我需要在子文件夹“Node/core/"中安装软件包:https://github.com/Microsoft/BotBuilder/tree/master/Node/core/
如何使用npm安装它?
6条答案
按热度按时间pzfprimi1#
将子文件夹的github链接粘贴到gitpkg中。然后您可以使用此沿着yarn或npm从github子文件夹安装软件包。
https://gitpkg.now.sh/
btxsgosb2#
添加到
package.json
:字符串
安装软件包后,
postinstall
脚本正在运行。一步一步来:
1.将文件夹设置为克隆存储库:
mkdir BotBuilder
1.进入文件夹:
cd BotBuilder
git init
1.将git origin设置为Microsoft/BotBuilder repo:
git remote add -f origin https://github.com/Microsoft/BotBuilder.git
1.启用sparse checkout:
git config core.sparseCheckout true
1.将
Node/core
添加到结帐列表:echo "Node/core" >> .git/info/sparse-checkout
git pull --depth=1 origin master
1.进入您的应用程序文件夹:
cd ..
1.安装BotBuilder:
npm i ./BotBuilder/Node/core/
fnvucqvd3#
如果包源托管在GitHub上,则可以像这样使用GitPkg:
字符串
对于您的特定情况,URL将是这样的:
型
在他们的site上有一个很好的类似向导的表单,可以帮助构建URL,以及安装它的命令。
bq8i3lrv4#
受到@Tomasz Jakub Rup的回答的启发。我更新了他的示例,并指出了他的示例所基于的3.0分支,并使用了新的git功能sparse-checkout。该功能将节省保存时间/带宽,因为它不需要提前克隆整个存储库,只会抓取您指定的内容。然而,许多服务器不支持--filter选项可以节省大量空间,但--depth 1在许多情况下仍然会减少带宽。
我使用了一个
.tmp_npm
文件夹来最小化文件夹,也可能是.gitignored,因为它是一个隐藏文件。字符串
jm81lzqq5#
可能有点跑题,但还是和问题有关
https://git-scm.com/book/en/v2/Git-Tools-Submodules
Git Submodules是可以在其他仓库中使用的git仓库(以下简称为Supermodules)。每个子模块都有通常的分支功能和标签,其好处在于每个超级模块都是一个版本控制的可插拔组件,可以单独使用或与超级模块一起开发。
要添加子模块,请在超级模块中运行以下命令:
字符串
子模块仍然需要初始化并从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
个tez616oj6#
如果GitPkg对你不起作用,npm有一个很棒的功能,叫做'workspaces',从v7开始。这些是你从主仓库的子文件夹管理,部署等的朋友。它们允许你为你的子文件夹定义一个npm身份,并使它在本地仓库和其他仓库中都能使用
npm install
。定义你的工作区就像定义一个包所在的文件夹一样简单。用你的GitHub org命名它,我们称之为'@ namespace'。把你的
package-name
子文件夹放在里面,然后在repo root的package.json
中添加一行:字符串
然后,运行
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:
型
尽管如此,npm将知道从GitHub Packages发布或安装@namespace中的任何依赖项。并且您将无需额外费用即可完成子文件夹的发布。
(Note:GitPkg是一个很棒的社区服务,我在使用GitPkg/GitHubPackages之前尝试过它。然而,它是一个忙碌忙碌的研究生的副项目,目前有很多像我这样的用户报告了500个错误,他们由于某种原因无法使用他们的repo。如果它对你有用,那就太好了,但否则上面的方法就可以完成它,而且可能更具可扩展性。)