Files
pnpm/docs/store-layout.md
Zoltan Kochan 38837b131c Pure store (#524)
* feat: drop Node.js <= 6.3 support

BREAKING CHANGE:

drop support of Node.js pre-6.3

* refactor: remove the redundant subfolder in store

* refactor: rename linkPeers

* refactor: remove not used code

* feat: link each file separately

* refactor: change store structure

* refactor: resolve github dependencies to commits

* chore(package.json): pass --preserve-symlinks to ts-node

* test: temporarily skip failing tests

* refactor(git): use more human-friendly Git IDs

* refactor: resolve

* refactor: divide resolution and fetching

* refactor(fetch): better variable naming

* feat: add shrinkwrap.yaml

* test(shrinkwrap): shrinkwrap locks dependencies

* style: fix typing issue

* fix(fetch): properly link node_modules on repeat install

* refactor: comment skipped test with single-line comments

* fix: circular symlinks are avoided

* refactor(fetch): remove redundant type properties

* test: additional check for circular symlinks

* feat: saving dependency graph in node_modules instead of in store

BREAKING CHANGE:

Dependency graph moved out from store

* feat: add store.yaml with info about dependent projects

* refactor: remove name from FetchedPackage

* refactor: change the location of packages from npm in store

BREAKING CHANGE:

Structure of store changed

* refactor: change global store path

BREAKING CHANGE:

Move the store path out of ~/.pnpm

* refactor: remove justFetched from FetchedPackage

* refactor(install): use functional programming to filter deps

* refactor(install): remove redundant node_modules creation

* fix(install): installation of concurent circular dependencies

* feat: copy not link some packages

Packages that have install lifecycle events are copied not linked.

* fix(store.yaml): don't duplicate records

* perf: resolve a package only once per project

* test: concurrent installation of the same dependency

* fix: packages are not removed in the middle of fetch

* fix: dependencies are linked only once

* fix: make linking work on Windows

* fix: installing local dependencies on Windows

* fix: don't reinstall dependencies of the same package

* fix(bin): the run function always returns a Promise

* fix: use hard links to link files to the .resolutions folder

* fix: peers are linked into the correct location

* fix: bundled dependencies are not reinstalled

* refactor: remove unsymlink

It is not used anymore

* chore(CI): test on Node.js v4 as well

* refactor: use UPPER_CASE for constants

* chore(package): return support of Node.js v4

* fix: make pnpm Node.js 4 compatible again

* test: don't run tsnode with --preserve-symlinks

--preserve-symlinks makes tests fail on Node.js 4

* fix(bin): don't use --preserve-symlinks on Node pre-6.3

* test: use global stores in tests

* fix: flat-tree installation should not work on Node 4

* fix: show warning

When trying to install into a node_modules created by older pnpm

* refactor: change the global store location

From `~/.store` to `~/.pnpm-store`

* docs: note that some of the info is out of date

* test: fix typing error

* test: fix frequently failing test
2017-01-08 15:47:50 +02:00

54 lines
2.2 KiB
Markdown

# Store layout
## This documentation is currently out of date!
`pnpm` maintains a flat storage of all your dependencies in `node_modules/.store`. They are then symlinked whereever they're needed.
This is like `npm@2`'s recursive module handling (without the disk space bloat), and like `npm@3`s flat dependency tree (except with each module being predictably atomic).
To illustrate, an installation of [chalk][]@1.1.1 may look like this:
```
.
└─ node_modules/
├─ .store/
| ├─ store.yaml
│ ├─ chalk@1.1.1/_/
│ │ └─ node_modules/
│ │ ├─ ansi-styles -> ../../../ansi-styles@2.1.0/_
│ │ ├─ has-ansi -> ../../../has-ansi@2.0.0/_
│ │ └─ supports-color -> ../../../supports-color@2.0.0/_
│ ├─ ansi-styles@2.1.0/_/
│ ├─ has-ansi@2.0.0/_/
│ └─ supports-color@2.0.0/_/
└─ chalk -> .store/chalk@1.1.1/_
```
The intermediate `_` directories are needed to hide `node_modules` from npm utilities like `npm ls`, `npm prune`, `npm shrinkwrap` and so on. The name `_` is chosen because it helps make stack traces readable.
[store.yaml](store-yaml.md) contains information about all the different internal/external dependencies that the packages in the store have.
[chalk]: https://github.com/chalk/chalk
## Peer dependencies
Symlinks to deep dependencies are stored in `node_modules/.store/node_modules`, in addition to the diagram above. It looks something like this:
```
.
└─ node_modules/
├─ .store/
| ├─ store.yaml
│ ├─ chalk@1.1.1/_/
│ ├─ ansi-styles@2.1.0/_/
│ ├─ has-ansi@2.0.0/_/
│ └─ node_modules/
│ └─ ansi-styles -> ../ansi-styles@2.1.0/_
│ └─ has-ansi -> ../has-ansi@2.0.0/_
└─ chalk -> .store/chalk@1.1.1/_
```
In the example above, this allows `ansi-styles` to `require('has-ansi')`. This is necessary to make certain packages work, such as [standard][] ([eslint][] + [eslint-config-standard][]).
[standard]: https://github.com/feross/standard
[eslint]: http://eslint.org/
[eslint-config-standard]: https://github.com/feross/eslint-config-standard