+1 to shrinkwrap before publish
On 2018-09-15 00:27, raphine...@gmail.com wrote:
Please note that I'm not suggesting to commit shrinkwrap to the master of
every repository. That is what had been discussed in the mailing list
thread from 2014 that you shared. That option was dismissed then, and
rightly so. It is also strongly advised against in the npm docs.
I suggest using it only in release branches of CLI or other non-library
releases, so they are immutable and don't mutate over time. _This is
exactly the intended use_. And it comes at no cost other than having to run
`npm shrinkwrap` right before the release.
Plus, it allows us to override transitive dependency versions for a release
if absolutely necessary.
Am Sa., 15. Sep. 2018 um 00:16 Uhr schrieb Jesse <purplecabb...@gmail.com>:
I personally see shrinkwrap as a step in the wrong direction, I feel like
it has been explored in the past, and the general consensus is that it is
something to avoid.
If committing package-lock is contentious, I am okay with skipping it, but
we need to be careful to lock down our own dependencies and not use
wildcards.
We have flexibility in our current GitHub repos, which allow us to remix
and freely link other dependent packages so we can debug right through our
deps. I agree we need more stability around the release/publish steps so
we can move more quickly through the collection of packages that make up a
'tools' release.
@purplecabbage
risingj.com
On Fri, Sep 14, 2018 at 2:56 PM <raphine...@gmail.com> wrote:
No. This won't fix anything. Plus it goes directly against npm's
recommendation. Please double check the docs for the use cases of
package-lock.json vs npm-shrinkwrap.json.
Am Fr., 14. Sep. 2018 um 23:48 Uhr schrieb Chris Brody <
chris.br...@gmail.com>:
A really nice alternative may be to turn the generated
package-lock.json into npm-shrinkwrap.json (using npm shrinkwrap
command) then commit npm-shrinkwrap.json. Then I think any other npm
install updates would update npm-shrinkwrap.json instead of
package-lock.json. Could be more predictable and easier to understand.
This was already discussed in 2014 [1], thanks to Jesse for the link in
[2].
Thanks for the suggestion to use npm shrinkwrap as a solution for
cordova-cli 8.1.0 minor release in [2].
[1]
https://lists.apache.org/thread.html/99184622129935eb473e843e583bf6648faff279a014e8508cc2c660@1411013202@%3Cdev.cordova.apache.org%3E
[2]
https://lists.apache.org/thread.html/f89a074add24f2ace7006b0211cf43a47cc5c1a0a65932fc22515828@%3Cdev.cordova.apache.org%3E
On Fri, Sep 14, 2018 at 3:53 PM Chris Brody <chris.br...@gmail.com>
wrote:
To be honest I have pretty limited experience with package lock file
and it is now starting to show. From Oliver's very unfortunate
experience I would conclude that this is something we should do very
carefully and not just on a whim. Some things I can think of:
* always use recent version of npm such as npm@6.4.1 to generate or
update package-lock.json
* do not use. npm cache when generating or updating
package-lock.json,
or use the npm cache with extreme care (also limited experience for
me)
* be extremely careful with assumptions; I think we should both
double-check the documentation and do our own experimentation, like I
did in <https://github.com/apache/cordova-cli/pull/325> to validate
as
best we can
* semver package seems to be a major library package used by npm; we
should both read the documentation and experiment, ideally with its
own test cases
On Fri, Sep 14, 2018 at 9:47 AM Oliver Salzburg
<oliver.salzb...@gmail.com> wrote:
The problems that appear when you have linked dependencies is that
npm
will pick them up as being bundled and mark them as such in the
lockfile. *However* this behavior has changed in the past. At one
point
this affected any direct dependency, at another point it "only"
affected
dependencies of dependencies.
Either way, the result is:
a) a corrupted lockfile, which has dependencies marked as bundled
b) a lockfile that lists incorrect versions, resulting from linking
temporary development snapshots together
When you use a local npm cache and you neglected to correctly
parameterize your npm calls, you now have your custom registry URL
in
the lockfile for every package it installed from there. This makes
it
unusable for others.
The issue that ultimately drove us away from this concept was that
locally cached packages were installed over linked modules, because
the
package manager did not understand that they are linked.
But because they were linked, the cached package contents were
placed
in
my local development checkout of that linked module. That obviously
caused all uncommitted changes to be deleted.
Additionally, if you already have linked modules set up, but the
lockfile says that a certain dependency is to be replaced, it will
just
break your link or replace your linked code as soon as you `npm
install`.
We had so many issues with this, I'm sure I'm only remembering the
tip
of the ice berg. Maybe all of this was fixed somehow, but I doubt
it.
At
the time when I reported these issues, there was little interest in
resolving them.
However, I'm not unfamiliar with the lockfile-driven workflow as
many
OSS projects I contributed to use it. It is not uncommon to
completely
wipe your node_modules and/or package-lock.json to rebuild it,
because
of corruptions in either entity. And that is something that has
been
confirmed to me many times by other developers. As in "That's just
how
it is."
This entire area of issues was not exclusive to npm either. We
extensively evaluated yarn regarding these aspects and it performed
just
as poorly.
I consider these aspects unacceptable for a development workflow as
they
introduce an unreliability where I can't have one.
If someone came out and told me "Hey, you've been doing it wrong
all
along. These are your mistakes and this is how you resolve them."
then
I'd be very happy to hear that :)
On 2018-09-14 15:13, raphine...@gmail.com wrote:
Thanks for picking this up again Chris. I think now is a better
time
for
second thoughts than later.
I've had a look at your experiment and the behavior you observed
is
to be
expected and desirable, as I explained in more detail in a
comment
[1]
there. As I also mentioned there, deleting and regenerating
package-lock.json
is a valid approach _if and when_ you want to do a full
dependency
update,
as we regularly do.
Also, thanks for posting Oliver's message here for better
visibility
in
this discussion. What I _do_ find a bit disturbing is the
problems
he
mentioned regarding linking (as in `npm link`) of different
modules
which
are all using lock files. He expressed his concern regarding that
particular use-case again in a comment [2] of a PR where we
touched
that
topic. I think it is important we test this, since the ability to
link
modules is vital for our development workflow and I have no
experience with
package-lock.json in projects where a lot of linking is
necessary.
Finally, I think we might need to re-evaluate our presumed
knowledge
about
the topic at hand. I encourage all those interested to read
[3][4][5] so we
all know what we are talking about. I had my facts wrong too and
nobody
corrected me, when I uttered them here in this thread. So here's
a
quick
(probably incomplete) round up of what package-lock.json does and
does not
do:
- It does provide a snapshot of the dependency tree that can
be
committed into source control to avoid automatic updates of
(transitive)
dependencies break the build _during development and CI_
- It _does not_ ensure that a user installing the published
package gets
exactly the dependency versions that are specified in
package-lock.json.
That is what npm-shrinkwrap.json [5] is for.
- It does speed up installation of dependencies in
conjunction
with `npm
ci` by skipping the entire dependency resolution and using
the
versions
from the lock file.
- It is required to be present for `npm audit` [6], although
it
could be
generated ad-hoc.
- It is possible to manually tinker with the lock file to fix
audit
issues with transitive dependencies that have no update
available. This
requires some special care to prevent npm from resetting
these
manual
changes, but it's a valuable last-resort option. However,
this
is far more
useful with npm-shrinkwrap.json to create releases without
security
issues.
With that cleared up, my stance on committing package-lock.json
is
as
follows:
- Faster CI installations and faster/easier usage of `npm
audit`
are
purely convenience features for me.
- Consistent developer builds and updates only on-demand are
real
advantages for me. I just recently spent hours finding out
why
some tests
of cordova-lib were suddenly failing. It turned out it was
caused by an
update to `jasmine@3.2.0`.
- If the package-lock.json really should interfere with our
ability to
link repositories for development, then that would be a deal
breaker for me.
However, the primary goal that I wanted to achieve was _immutable
releases_. That is, installing e.g. `cordova@9` should _always
install the
exact same set of packages_. What we need for that is
npm-shrinkwrap.json.
So IMO whether we decide for or against using package-lock.json,
we
should
lock down the dependencies for releases of our CLIs, platforms
and
possibly
plugins by generating and committing a npm-shrinkwrap.json to the
_release
branch_ before packaging the release.
Cheers,
Raphael
[1]:
https://github.com/apache/cordova-cli/pull/325#issuecomment-421336025
[2]:
https://github.com/raphinesse/cordova-common/pull/1#issuecomment-420950433
[3]: https://docs.npmjs.com/files/package-locks
[4]: https://docs.npmjs.com/files/package-lock.json
[5]: https://docs.npmjs.com/files/shrinkwrap.json
[6]:
https://docs.npmjs.com/getting-started/running-a-security-audit
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@cordova.apache.org
For additional commands, e-mail: dev-h...@cordova.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@cordova.apache.org
For additional commands, e-mail: dev-h...@cordova.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@cordova.apache.org
For additional commands, e-mail: dev-h...@cordova.apache.org