Minstall is a local module installer, intended to be used as postinstall-script.
Let's say you have the following modular app, and run npm install
on it:
my-modular-app
├── modules
│ ├── database
│ │ ├── index.js
│ │ └── package.json [requires mongoose and lodash]
│ └── tasks
│ ├── index.js
│ └── package.json [requires lodash and database]
├── index.js
└── package.json [requires express, uses database and tasks]
- Your local modules (
database
andtasks
) wouldn't work, because their dependencies are missing. - To require your modules, you would need to either npm-link them, or use a
./modules/
-prefix
Minstall installs the necessary dependencies to the root-node_modules
, and symlinks the modules there.
After running npm install
with minstall as postinstall, the structure looks like this:
my-modular-app
├── modules
│ ├── database
│ │ ├── index.js
│ │ ├── node_modules
│ │ │ ├── lodash -> ../../../node_modules/lodash
│ │ │ └── mongoose -> ../../../node_modules/mongoose
│ │ └── package.json
│ └── tasks
│ │ ├── index.js
│ │ ├── node_modules
│ │ │ └── lodash -> ../../../node_modules/lodash
│ │ │ └── database -> ../../database
│ │ └── package.json
├── node_modules
│ ├── lodash
│ ├── minstall
│ └── mongoose
├── index.js
└── package.json
- All modules work, because their dependencies are present
- conflicting dependencies end up in the associated modules, not in the root
- Modules can be required directly, because they are symlinked
->require('./modules/database')
require('database')
- The installation is faster and smaller, because dependencies are only installed once
- dependencies that are already installed, are not re-downloaded (except for npm5 users, because of npm issue #16853)
- install with
npm install minstall --save
- add it as postinstall-script to your package.json:
modules-folder
is optional, and defaults tomodules
if omitted
"scripts": {
"postinstall": "minstall <modules-folder>"
}
Minstall knows the following flags:
--no-link
prevents minstall from linking the local modules to the root-node_modules--link-only
makes minstall go through the linking-process only, without installing anything--cleanup
makes minstall remove all node_modules-folders before installing dependencies (this is forced for npm5)--dependency-check-only
makes install print the dependency-check only, without touching any files or installing anything--assume-local-modules-satisfy-non-semver-dependency-versions
(aka--trust-local-modules
) makes minstall assume that a local module satisfies every requested version of that module that is not valid semver (like github-urls and tag-names)--loglevel <loglevel>
sets the loglevel (error
,warn
,info
verbose
,debug
,silly
)--no-hoist <dependency>
. makes minstall not hoist that dependency.<dependency>
has the form name@versionRange, e.g.--no-hoist aurelia-cli@^0.30.1
. If you omit the versionRange, no version of that dependency will be hoisted. The name can be a glob expression (see minimatch), e.g.--no-hoist aurelia-*
. This is useful for dependencies that don't play nice when hoisted/linked. This flag can be added multiple times.