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.