在git control

时间:2016-08-05 08:42:29

标签: git npm

我有很多git存储库,每个存储库都有自己的npm package.json文件,它们相互引用。当我使用npm install安装主程序包时,它成功克隆了所有package.json中引用的所有git repos到node_modules文件夹中。但是,它们没有克隆.git文件夹,以便我在源代码管理下保留任何更改。是否可以npm安装这些软件包并获取.git文件夹?

由于

3 个答案:

答案 0 :(得分:2)

它们并不适合所有人,但我真的很喜欢使用git子模块进行此类操作,因此我想找到一种方法来使用它们:

  1. local_modules/下添加子模块:

    git submodule add -b develop git@github.com:JarvusInnovations/git-client.git local_modules/git-client
    
  2. 使用file:前缀声明package.json中的依赖项:

    {
      "dependencies": {
        "git-client": "file:local_modules/git-client"
      }
    }
    
  3. 刷新node_modules/

    npm install
    

现在,NPM在node_modules/下创建到../local_modules/git-client的符号链接,您可以将希望子模块放在的任何HEAD提交到主项目。这样您的开发人员工作流程就可以像

  1. 在主项目和模块上进行一系列更改,这是紧密结合的
  2. 在子模块中进行提交以添加/更改功能
  3. 在主项目中进行提交,其中既包括子模块版本的更改,也包括与主模块锁定在一起的主项目中的更改

现在,当其他开发人员克隆(--recursive)或拉动(然后运行git submodule update --init)您的预发布工作时,就可以保证他们具有正确的预发布模块代码< / p>

答案 1 :(得分:1)

通常,node_modules内的文件应由npm管理。 Node最初并没有这样设计,但是npm已经发展成为node.js的标准包管理工具(它甚至还带有节点!)。

如果您有自己想要维护的模块,有几种方法可以处理它。

打包特定模块

(有时也被称为&#34; libs&#34;)

编写自己的模块的最简单方法是要求使用相对或绝对路径:

var my_module = require('./my_module'); // notice '.js' is not needed

大多数人将所有特定于程序包的模块放在名为libsrc的目录中。所以你可以要求它们:

var my_module = require('./lib/my_module');

请注意,该路径相对于您正在编辑的文件。因此,如果lib文件需要另一个lib文件,则不需要'/lib'

精美套餐专用模块

有些人不喜欢'./lib/..'require()的外观。但是他们仍然希望他们的软件包特定模块受到软件包repo的控制。在这种情况下,一种解决方案是将模块符号链接到node_modules

在我的一个项目中,我在package.json中有这个:

"postinstall": "bash -c 'cd node_modules;ln -sf ../lib/*.js .'"

它的作用是在.js运行./lib时创建npm install内{/ 1}}个文件到node_modules文件夹的符号链接。

独立模块分成几个项目

如果你的几个项目共享了几个模块,你可以(ab)使用node.js搜索模块的方式。 Node.js将搜索当前目录中的文件夹node_modules,并在那里搜索该模块,如果找不到它,它将递归node_module文件夹的父目录等。一直到根目录。

因此,拥有自己的自我管理模块的一种方法是在父目录中放置一个node_modules文件夹:

/home/myself/
    code/
        node_modules/
            my_module1.js
            my_module2/
                node_modules
                .git
                index.js
                package.json
        project1/
            node_modules/
            .git
            main.js
            package.json
        project2/
            node_modules/
            .git
            main.js
            package.json

通过这种方式,project1project2都可以访问my_module1my_module2。另外my_module2可以拥有自己的git repo。

答案 2 :(得分:1)

参加晚会但是在阅读了几篇帖子后,包括这一篇以及几次抨击/测试时间之后,我觉得有必要在版本控制下分享我对本地仓库的看法,该版本控制被用作节点项目中的软件包。

从项目的根目录执行此操作:

npm link /path/to/your/local/package/

npm link <"name:">“name:”键在本地包的package.json

npm install --save /path/to/your/local/package/

使用“link”在npm文档中找不到的最后一个,但它是关键的

note :您可以使用相对路径(例如,如果共享父文件夹,则为../<localpackagefoldername>

重要:你的本地包package.json必须有一个包“name:”键和一个指向入口点js文件的“main:”键,否则这一切都会失败。

现在您可以在代码中使用require('name'),稍后如果您发布到npm,则无需更改任何期望项目package.json中的行,这将很容易删除并{{1编辑。

如果使用npm install将包添加到本地模块,则在项目中执行相同操作,并将其添加到项目的node_modules中。如果您在本地套餐中执行npm install,请在项目中执行npm uninstall

note :如果您在本地软件包根目录中运行npm prune,那么就为该软件包创建了node_modules,现在当您在项目中npm install时,您将获得这样的警告你可以忽略npm install。如果您有错误,那么如果您没有单独运行它,请删除本地包中的node_modules文件夹。

从npm 3开始,node_modules现在已经展平,因此这样做意味着项目中的本地包依赖性也会变平!此外,您不能只将完整的git repo放入node_modules,因为npm会鄙视.git文件夹,当然您将嵌套node_modules。

我的大招数:当然,您可以将本地软件包存储在与项目分开的目录中,但如果您在项目的子目录中创建git子模块,则可以获得两全其美的效果,flat_ned node_modules中的依赖项,同时组合推送项目和包(子模块)。另外,它使这些链接命令路径变得微不足道。

提示:如果您使用单独的目录(无子模块)路径,则使用您的ide编辑器(例如atom)将本地包文件夹添加到项目树中,以便使用您的项目进行编辑。太多了,如果你走这条路线,你可以提交并推送更改本地包,因为它不是一个子模块。

这个我能想到的唯一警告可能是确保你的本地包中有依赖项,即使它们在项目的package.json中,否则如果有人在其他地方使用本地包(在它自己的地方) )它将缺少skippingAction Module is inside a symlinked module: not running remove

的依赖项