I am developing in two repos, one a dependency of the other. I am on npm v5. I specify the dependency in package.json
of main-repo
as ../dependent-repo
. When I do npm install
, this creates a symlink for dependent-repo
in main-repo/node_modules
, pointing to ../../dependent-repo
.
The problem is that dependent-repo
has its own node_modules
underneath it, so when I refer to (require or import) something in one of its dependencies, the default resolution procedure resolves to the dependency in dependent-repo/node_modules
, rather than the dependency in main-repo/node_modules
.
This turns out to be a problem with TypeScript, since apparently it believes that main-repo/node_modules/@angular/core
is distinct from dependent-repo/node_modules/@angular/core
, even if they are the same version, and byte-for-byte identical. This gives rise to TS errors of the form
Argument of type 'ViewContainerRef' is not assignable to parameter of type 'ViewContainerRef'.
I am familiar with this problem because it also occurred with npm v3 when I used npm link
. That problem has been discussed extensively on the TS issues list, but with no resolution as far as I can tell. I was hoping that npm v5 would somehow magically solve this issue, but no luck so far.
I tried specifying the dependency as file://../dependent-repo
, but this also merely creates the same symlink (as least in npm5; I seem to recall that in earlier versions if may have copied the directory lock, stock and barrel).
At the moment the only workaround I can see is leaving the dependency to point to the github server, then committing and pushing every single change I make, and re-running npm install
on the main repo to bring in the latest changes. This was exactly what I was trying to avoid.
I thought of temporarily renaming dependent-repo/node_modules
before testing main-repo
, so it is omitted from the resolution process. However, this obviously requires all dependencies of dependent-repo
to be present on main-repo
.
I tried playing a bit with the paths
option to tsconfig.json
(in main-repo
), and had some luck with things like paths: {"*": ["node_modules"]}
, but couldn't get this to work completely.
I understand that angular-cli
may have made some changes to its internal webpack configuration to make this work better, but unfortunately my main-repo
uses an older webpack build process, and I could not make some of the suggested changes such as resolve: {fallback: [path.join(__dirname, 'node_modules')]}
or resolve: { modules: [ path.join(__dirname, "node_modules") ] }
work for me.