I have a company private Angular library we publish to a local feed (not NPM). This lib is used in about a dozen internal company Angular applications, none of these on mono repo. (lib and apps have all their own repo)
Within the lib I want a dependency “wrapped” by my own component. I don’t want to expose the dependency to the applications and I don’t want to add the dependency to any of the applications’ package.json
as required by peer dependencies.
The reason is if the dependency goes belly up, I could replace it with something else or write my own functionality from scratch on the wrapping component at the lib. For as long as I don’t change the inputs/outputs of my lib’s component, the consuming applications need only a patch update on my lib and I don’t need to go to all of those apps and change dependencies (apps only depend on my lib; I don’t want them to import anything directly from the dependency… apps need to go through the lib)
For development we use ng b --watch
at the lib with a symlink at the app’s node_modules
to the dist
folder of the lib (as created by npm i {filespec_for_lib_dist_folder})
Everything works fine only if I add the dependency to the lib as a peerDependency
and then add the dependency again to the app, but that’s what I’m trying to avoid, no dep on the app. If I take the dep from the app, ng s
on the app fails with errors of “lib cannot find dep”.
At the lib I have:
workspace package.json
{
-- name, version, private, etc --
...
dependencies: {
dep:^3.0.8,
ts-lib:^2.6.2
},
peerDependencies: {
-- Angular libs + other libs needed on both my lib and my apps --
},
devDependencies: {
-- same as peerDependencies --,
-- other dev dependencies --
}
}
lib folder package.json
{
"name": "my-lib",
"version": "1.1.0"
}
My thinking is since it is only one lib on the repo I can use the wokspace package.json
only
At the app’s package.json
{
...
dependencies: {
-- Angular + a bunch of other stuff including lib's peer dependencies but not lib's dependency --,
my-lib:^1.1.0
--- or ---
my-lib: file:"{spec-to-dist-folder}"
...
}
}
That is depending whether I want to bring from the feed or from the local watch.
At the lib, I normally npm install
at the workspace, or npm ci
if I didn’t make any changes and I just pulled from other devs, then ng b --watch
.
With the lib on watch, at the app is the same npm install
or npm ci
, followed by ng s
, but this last one fails because the dependency was not found by the lib. (even though I see the lib’s dep in the app’s node_modules
)
All this is on Windows, Angular17, NodeJs21, NPM10
Any suggestions?
I tried adding the dependency on the package.json
of the lib, not at the workspace, but result was the same.
I added the dependency to the allowedNonPeerDependencies
so the peerDependencies
warning on build is gone, but still no luck with my goal.
Keith Glass is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.