Better workflow than npm | yarn link for package authors.
When developing and authoring multiple packages (private or public), you often find yourself in need of using the latest/WIP versions in other projects that you are working on in your local environment without publishing those packages to remote registry. NPM and Yarn address this issue with a similar approach of symlinked packages (npm/yarn link). Though this may work in many cases, it often brings nasty constraints and problems with dependency resolution, symlink interoperability between file systems, etc.
yalcacts as very simple local repository for your locally developed packages that you want to share across your local environment.- When you run
yalc publishin the package directory, it grabs only files that should be published to NPM and puts them in a special global store (located, for example, in~/.yalc). - When you run
yalc add my-packagein yourprojectit pulls package content into.yalcin the current folder and injects afile:/link:dependency intopackage.json. Alternatively, you may useyalc link my-packagewhich will create a symlink to the package content innode_modulesand will not touchpackage.json(likenpm/yarn linkdoes), or you even may use it with Yarn workspaces. yalccreates a specialyalc.lockfile in your project (similar toyarn.lockandpackage.json) that is used to ensure consistency while performingyalc's routines.yalccan be used with projects whereyarnornpmpackage managers are used for managingpackage.jsondependencies.
Using NPM:
npm i yalc -g
Using Yarn:
yarn global add yalc
Some documented features might not has been published yet, see change log.
- Run
yalc publishin your dependency packagemy-package. - It will copy all the files that should be published in remote NPM registry.
- It will run
preyalcorprepublishscripts before, andpostyalcorpostpublishafter. Use--forceto publish without running scripts. - While copying package content,
yalccalculates the hash signature of all files and, by default, adds this signature to the package manifestversion. You can disable this by using the--no-sigoption. - You may also use
.yalcignoreto exclude files from publishing to yalc repo, for example files like README.md, etc. --filesflag will show included files in published package- NB! Windows users should make sure the
LFnew line symbol is used in published sources; it may be needed for some packages to work correctly (for example,binscripts).yalcwon't convert line endings for you (becausenpmandyarnwon't either). - NB! Note that, if you want to include
.yalcfolder in published package content, you should add!.yalcline to.npmignore. - Easily propagate package updates everywhere.
- Run
yalc add my-packagein your dependent project, which will copy the current version from the store to your project's.yalcfolder and inject afile:.yalc/my-packagedependency intopackage.json. - You may specify a particular version with
yalc add my-package@version. This version will be fixed inyalc.lockand during updates it will not affect newly published versions. - Use the
--linkoption to add alink:dependency instead offile:. - Use the
--devoption to add yalc package to dev dependencies. - With
--pureflag it will not touchpackage.jsonfile, nor it will touch modules folder, this is useful for example when working with Yarn workspaces (read below in Advanced usage section)
- As an alternative to
add, you can use thelinkcommand which is similar tonpm/yarn link, except that the symlink source will be not the global link directory but the local.yalcfolder of your project. - After
yalccopies package content to.yalcfolder it will create a symlink:project/.yalc/my-package ==> project/node_modules/my-package. It will not touchpackage.jsonin this case.
- Run
yalc update my-packageto update the latest version from store. - Run
yalc updateto update all the packages found inyalc.lock. - While update if yalc'ed package has
scripts.postupdatethis command will run in host package dir.
- Run
yalc remove my-package, it will remove package info frompackage.jsonandyalc.lock - Run
yalc remove --allto remove all packages from project.
NB! Currently, yalc copies (or links) added/updated package content to the node_modules folder, but it doesn't execute yarn/npm install/update commands after this, so dependencies must be updated manually if necessary.
- When you run
yalc add|link|update, the project's package locations are tracked and saved, soyalcknows where each package in the store is being used in your local environment. yalc publish --pushwill publish your package to the store and propagate all changes to existingyalcpackage installations (this will actually doupdateoperation on the location).yalc push- is a use shortcut command for push operation (which will likely become your primarily used command for publication):forceoptions istrueby default, so it won't runpre/postscripts (may change this with--no-forceflag).
scripts.postupdatewill be executed in host package dir, like whileupdateoperation.- With
--changedflag yalc will first check if package content has changed before publishing and pushing, it is quick operation, maybe useful for file watching scenarios with pushing on changes.
- If you are using
yalc'edmodules temporary while development, first add.yalcandyalc.lockto.gitignore. - Use
yalc link, that won't touchpackages.json - If you use
yalc addit will changepackage.json, and adsfile:/link:dependencies, if you may want to useyalc checkin the precommit hook which will check package.json foryalc'eddependencies and exits with error, if you forgot to remove them.
- You may want to keep shared
yalc'edstuff within the projects you are working on and treat it as a part of the project's codebase. This may really simplify management and usage of shared work in progress packages within your projects and help to make things consistent. So, then just do it, keep.yalcfolder andyalc.lockin git. - Replace it with published versions from remote repository when ready.
- NB! - standard non-code files like
README,LICENCEetc. will be included also, so you may want to excluded them in.gitignorewith a line like**/.yalc/**/*.mdor you may use.yalcignorenot to include those files in package content.
- Useful for monorepos (projects with multiple sub-projects/packages):
yalc publish package-dir will perform publish operation in nestedpackage` folder of current working dir.
Use with Yarn workspaces!
Use if you will try to add repo in workspaces enabled package, --pure option will be used by default, so package.json and modules folder will not be touched.
Then you add yalc'ed package folder to workspaces in package.json (you may just add .yalc/* and .yalc/@*/* patterns). While update (or push) operation, packages content will be updated automatically and yarn will care about everything else.
If you want to override default pure behavior use --no-pure flag.
- While working with yalc for some time on the dev machine you may face the situation when you have locations where you added yalc'ed packages being removed from file system, and this will cause some warning messages when yalc will try to push package to removed location. To get rid of such messages there in an explicit command for this
yalc installations clean [package].
- yarn probably shouldn't cache packages resolved with a file path
- "yarn knit": a better "yarn link"
- npm-link-shared
- yarn link does not install package dependencies
- [npm] RFC: file: specifier changes
WTF.