
Crom – A package manager without the package registry - kmfrk
https://github.com/mbostock/crom
======
mbostock
Author here. This is currently at the stage of an afternoon thought
experiment, but I’m interested in your feedback and help!

Probably the most important open issue is that simple names aren’t a
sufficient identifier with a decentralized registry: you need a URL. So once
Crom learns how to save package metadata, it should probably map any specified
short name (e.g., `d3-format`) into a full URL
([https://github.com/d3/d3-format](https://github.com/d3/d3-format)) to ensure
stability.

Mutable releases are also a concern, but Crom could save the hash of installed
packages so you’d know if anything changed. And of course, since it’s
decentralized, you could still have third-party registries that make immutable
copies, if that’s your thing.

~~~
k__
Nix wasn't a possibility?

~~~
mbostock
How does Nix find packages? E.g., how does `nix-env --install firefox` get
mapped to a specific package?

~~~
k__
As far as I know there are channels with nix-expressions (which are the
package definitions), which are descriptions of how gather the source-code or
binaries from specific URLs.

npm2nix for example only uses npm to gather the the packages from the
registry, but uses Nix for all the other stuff. [0]

[0]: [http://sandervanderburg.blogspot.de/2014/10/deploying-npm-
pa...](http://sandervanderburg.blogspot.de/2014/10/deploying-npm-packages-
with-nix-package.html)

~~~
mbostock
It’s hard to tell how much overlap there is.

One of way of looking at Crom is that it provides a more convenient interface
than a URL, yet without the centralization that comes from using names in a
registry.

Crom helps you go from a name to a URL (via search heuristics), but it’s the
URL that ultimately serves as the identifier. So, if you author a package.json
with a name like “d3-format”, that gets expanded to a full URL, perhaps with
interactive confirmation. (Or not, because it’s trivial to undo and redo.)

Also, unlike a URL to the ZIP file directly, a package URL in Crom supports
semantic versioning: it refers to all versions of a project, and thus you can
upgrade or specify a desired version range.

------
polm23
Reminds me of vim plugin managers like Vundle or NeoBundle. The way they work
is you specify a package name and it uses a heuristic to figure out where to
look. To steal from the Vundle README...

[https://github.com/VundleVim/Vundle.vim](https://github.com/VundleVim/Vundle.vim)

    
    
        " The following are examples of different formats supported.
        " Keep Plugin commands between vundle#begin/end.
        " plugin on GitHub repo
        Plugin 'tpope/vim-fugitive'
        " plugin from http://vim-scripts.org/vim/scripts.html
        Plugin 'L9'
        " Git plugin not hosted on GitHub
        Plugin 'git://git.wincent.com/command-t.git'
        " git repos on your local machine (i.e. when working on your own plugin)
        Plugin 'file:///home/gmarik/path/to/plugin'
        " The sparkup vim script is in a subdirectory of this repo called vim.
        " Pass the path to set the runtimepath properly.
        Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
        " Avoid a name conflict with L9
        Plugin 'user/L9', {'name': 'newL9'}
    

It's one of those things that works so well you can just kind of forget about
it once you get used to it, but you're not really locked in either.

------
codementum
Whether or not it becomes widely used (or developed further), I think crom is
a great idea.

Hopefully it will encourage developers beyond js to create usable, composable
modules. (LaTeX comes to mind...)

