<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">About a month ago, Jay posted a <a href="http://blog.racket-lang.org/2014/12/the-racket-package-system-and-planet.html" class="">blog post regarding the Racket package manager</a>. I found it interesting, so I posted a comment, but I also doubt <i class="">anybody</i> reads the blog comments, so I figured I’d also post it here.<div class=""><br class=""></div><div class="">I think Node.js's package manager gets versioning right. NPM uses <a href="http://semver.org/" class="">semver</a> to manage dependency versions, and it works well. The <a href="https://github.com/npm/node-semver" class="">node-semver</a> package demonstrates how this versioning works. A semver string is then included a module's dependencies list, which can specify all sorts of things, including "use the latest version of the library," "use the latest version given a particular major.minor string," and "use this precise major.minor.patch" version.<br class=""><br class="">NPM handles the rest, downloading the correct version of the dependencies. The reason this is tricky is that this requires every module to have its <i class="">own</i> set of dependencies, since different modules can request different versions of packages. I'm not sure exactly how Node handles loading multiple versions of the same dependency with regards to performance and interaction, though it might be worth looking into.<br class=""><br class="">In contrast, the Racket package manager provides very little versioning support, and packages have to be installed in an entire user or installation scope, rather than having module-specific dependency versioning. Is this bad? I don't know. But it's different, and I think NPM's model is worth considering.</div></body></html>