diff options
| author | William Boman <william@redwill.se> | 2021-11-29 10:53:31 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-29 10:53:31 +0100 |
| commit | a5168bbf4cc5871ee75f3c5ce779604279fad352 (patch) | |
| tree | 4a4e654e7e2ce8fed9cc6d24950aa7deb19b5f4b /lua | |
| parent | add csharpls (#294) (diff) | |
| download | mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.tar mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.tar.gz mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.tar.bz2 mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.tar.lz mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.tar.xz mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.tar.zst mason-a5168bbf4cc5871ee75f3c5ce779604279fad352.zip | |
installers/npm: use global style (#289)
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/nvim-lsp-installer/fs.lua | 8 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/installers/npm.lua | 32 |
2 files changed, 30 insertions, 10 deletions
diff --git a/lua/nvim-lsp-installer/fs.lua b/lua/nvim-lsp-installer/fs.lua index b6dce79d..38ac053f 100644 --- a/lua/nvim-lsp-installer/fs.lua +++ b/lua/nvim-lsp-installer/fs.lua @@ -101,6 +101,14 @@ function M.write_file(path, contents) assert(uv.fs_close(fd)) end +function M.append_file(path, contents) + log.fmt_debug("fs: append_file %s", path) + assert_ownership(path) + local fd = assert(uv.fs_open(path, "a", 438)) + uv.fs_write(fd, contents, -1) + assert(uv.fs_close(fd)) +end + ---@alias ReaddirEntry {name: string, type: string} ---@param path string @The full path to the directory to read. diff --git a/lua/nvim-lsp-installer/installers/npm.lua b/lua/nvim-lsp-installer/installers/npm.lua index 93c33532..afd697ab 100644 --- a/lua/nvim-lsp-installer/installers/npm.lua +++ b/lua/nvim-lsp-installer/installers/npm.lua @@ -35,17 +35,29 @@ local function create_installer(read_version_from_context) cwd = context.install_dir, stdio_sink = context.stdio_sink, } - -- stylua: ignore start - if not (fs.dir_exists(path.concat { context.install_dir, "node_modules" }) or - fs.file_exists(path.concat { context.install_dir, "package.json" })) - then - c.run(npm, { "init", "--yes", "--scope=lsp-installer" }) - end - if read_version_from_context and context.requested_server_version and #pkgs > 0 then - -- The "head" package is the recipient for the requested version. It's.. by design... don't ask. - pkgs[1] = ("%s@%s"):format(pkgs[1], context.requested_server_version) - end + -- Use global-style. The reasons for this are: + -- a) To avoid polluting the executables (aka bin-links) that npm creates. + -- b) The installation is, after all, more similar to a "global" installation. We don't really gain + -- any of the benefits of not using global style (e.g., deduping the dependency tree). + -- + -- We write to .npmrc manually instead of going through npm because managing a local .npmrc file + -- is a bit unreliable across npm versions (especially <7), so we take extra measures to avoid + -- inadvertently polluting global npm config. + fs.append_file(path.concat { context.install_dir, ".npmrc" }, "global-style=true") + + -- stylua: ignore start + if not (fs.dir_exists(path.concat { context.install_dir, "node_modules" }) or + fs.file_exists(path.concat { context.install_dir, "package.json" })) + then + -- Create a package.json to set a boundary for where npm installs packages. + c.run(npm, { "init", "--yes", "--scope=lsp-installer" }) + end + + if read_version_from_context and context.requested_server_version and #pkgs > 0 then + -- The "head" package is the recipient for the requested version. It's.. by design... don't ask. + pkgs[1] = ("%s@%s"):format(pkgs[1], context.requested_server_version) + end -- stylua: ignore end c.run(npm, vim.list_extend({ "install" }, pkgs)) |
