The JSON of package specs.
pkg.json is a wild-west "package" format for defining packages without a package system. It's a (very) limited subset of NPM's package.json that allows any project to declare dependencies on arbitrary URLs.
The initial use-case is for Vim and Emacs plugins (which can be downloaded from anywhere), but the format is designed to be generic.
See /docs for full documentation.
{ "name" : "lspconfig", // OPTIONAL cosmetic name, not used for resolution nor filesystem locations. "description" : "Quickstart configurations for the Nvim-lsp client", // OPTIONAL "engines": { "nvim": "^0.10.0", "vim": "^9.1.0" }, "repository": { // REQUIRED "type": "git", // reserved for future use "url": "https://github.com/neovim/nvim-lspconfig" }, "dependencies" : { // OPTIONAL "https://github.com/neovim/neovim" : "0.6.1", "https://github.com/lewis6991/gitsigns.nvim" : "0.3" }, } brew install luarocks make make test cd test-npm/ npm ci npm run test LuaRocks is a natural choice as the Nvim plugin manager, but defining a "federated package spec" also makes sense because:
- We can do both, at low cost.
pkg.jsonis a fairly "cheap" approach. - LuaRocks is a "centralized" approach that requires active participation from many plugins. In contrast,
pkg.jsonis a decentralized, "infectious" approach that is useful at the "leaf nodes": it only requires the consumer to provide apkg.json, the upstream dependencies don't need to be "compliant" or participate in any way. - LuaRocks + Nvim is starting to see progress, but momentum will take time. A decentralized, lowest-common-denominator, "infectious" approach can be tried without losing much time or effort.
- There's no central asset registry, just a bunch of URLs. (Though "aggregators" are possible and welcome.)
- LuaRocks has 10x more scope than
pkg.jsonand unresolved edge cases.pkg.jsonside-steps that by punting the ecosystem-dependent questions to the client.
TBD
- specify packspec (above)
- specify ecosystem-agnostic client behavior (report conflicts, fetch things into
pack/dir, update existing dir, ...) - specify what is undefined (i.e. owned by the per-ecosystem "engine", for example vim/nvim packages are fetched into 'packpath')
- TODO: support other kinds of artifacts, like zip archives or binaries.
- nested packages in workspace (
foo/pkg.json,foo/bar/pkg.json) - Nvim: client can support conflicting dependencies by using git worktree.