简体   繁体   中英

Does every git branch of an NPM project have different node_modules dependencies?

I assume that when developing an NPM project, that every git branch (or whatever version control system you use) probably points to a different set of node_modules on the filesystem. Is that true? How does that work? Does it pose any problems for diskspace etc?

Or perhaps, since node_modules is most commonly .gitignore'd , then the node_modules files are shared between Git branches? Again, how would/does that work?

*Note that Node.js / NPM is fundamentally different than other platforms/languages since dependencies are typically stored locally to a proejct rather than in some central location on a machine.

By convention, one should not add any files, libraries or binaries which can be generated or pulled in from an external source. This includes things like node_modules ; since that is made readily available* once you do npm install , there's no reason or incentive** to want to put that into your source control. At worst, it will also bloat your repository, filling your diffs with things you simply don't control and don't necessarily want to review.

I would not expect different Git branches of an NPM project to contain different node_modules folders. I'd only expect the one node_modules folder, and if a branch gave me fits about dependencies, I'd look to reinstall the dependencies (and note it down to be sure that something else hadn't gone awry).

As an addendum, any files or folders in .gitignore are simply not indexed or tracked by Git. If the contents of those files or folders change, Git is none the wiser. This also means, when switching between branches, the contents of the files or folders in .gitignore remain the same.

*: Provided that the library you're using isn't suddenly yanked. Or the repository is not impacted by a colossal DDoS.

**: There may be some incentive to do this given that the reliability of certain NPM packages hasn't been 100% this year, but that's a team and architecture-driven decision, and I doubt that placing it into source control is the most ideal and convenient way to deal with it.

There are two schools of thought, and both have merit.

1) Never check in node_modules and rebuild on deploy/install

The approach relies heavily on NPM and the connectivity of your deploy environment. node_modules are downloaded and installed (and/or compiled) each time the deploy is run.

Positives: Your repository is much smaller.

NPM modules are installed in the environment they will run on.

Concerns: Tied to 3rd party for sources - Go read about that whole left-pad thing. If one dependency cannot be downloaded, your entire build system is hung out to dry. "Cranky and paranoid old timers" will cite this as the reason to check everything in (or run your own private NPM somewhere).

Branch management - Like you mentioned in the question, some branches might not have the same dependencies. Dev1 adds a new features and used a new package. Now Dev2 runs the dev branch or whatever, and everything is broken and they need to know to npm install the new package. More subtle is the case where a npm package is version changed (now you need npm update as npm install will say nothing has changed), or where their node_modules are upgraded to work on "new feature 10" but they need to clear everything out to "downgrade" to go fix "prior bug 43". If you are in active development with a team of more than 2-3, watch out for this one.

Build Time - If it is a concern, it takes a little longer to download and install everything. Or a lot longer.

2) Always check in everything you can

This approach includes node_modules as part of the repo.

Positives: Not dependent on 3rd party sources. You have what you need to run. You code can live on its own forever, and it does not matter if npm is down or a repo is deleted.

Branches are independent, so new features from Dev1 are auto included when Dev2 switches to that branch

Deploy time is shorter because not much needs to be installed.

Concerns: Repository is much larger. Clones of code take longer as there are many more files.

Pull Requests need extra care. If a package is updated (or installed) along with core code, the PR is a mess and sometimes unintelligible. "500 files changed", but really you updated a package and changed two lines of core code. It can help to break down into two PRs - one that is is a mess (the package update) and one that is actually reviewable (the core code change). Again, be prepared for this one. The packages will not change too often, but your code review takes a little longer (or a little more care) when they do.

OS Dependent Packages can break. Basically anything that is installed/compiled with gyp can be OS dependent (among others). Most packages are "pure JS" and, being just scripts, run everywhere. Imagine all your devs run and test on OSX while you deploy to Linux, you cannot check in those packages that were compiled on a MAC because they will not run on Linux. An odd workaround for this is to define most packages as "dev dependencies" ( --save-dev ) and the ones that need compiled as normal ("production", --save ), then you run npm install --production so the dev dependencies are not installed (and are already present), but the others are.

Conclusions

It depends. (Don't you hate hearing that all the time? : )

Depending on your team and your concerns, you might go either approach. Both have their merits, and you will decide which is more beneficial to you. Both have drawbacks as well, so be aware of those before you get bit!

Two branches having different set of node modules is in scenario where one branch is in development phase and other is your production branch. In such cases development branch will have more node modules than production. If I am not wrong any other scenario might get you in trouble.

Pushing node_modules to remote version control repository is bad practice hence just rely on npm install whenever you clone a branch or pull the code to download any new node module added to package.json.

我个人忽略.node_modules但我在不同的分支中有不同的package.json,当我切换时我重新安装依赖项

显然,由于您的实际存储库中没有node_modules,因此需要再次安装节点模块,并且每个分支可能都有自己的要求,因为您可能会更新具有新依赖关系的server.js,并且还需要确保在生产服务器中也有这些新添加的节点依赖项。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM