mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-10-26 08:36:12 +01:00
feat: detect alternative package managers based on lockfile
If a package manager is not explicitly set in config.json or passed-in via argv/env, NodeBB will now check for the presence of alternative package managers' lockfiles and adjust the package manager to-be-used accordingly. If the standard npm lockfile exists, npm will always be used.
This commit is contained in:
@@ -53,15 +53,44 @@ pkgInstall.supportedPackageManager = [
|
||||
];
|
||||
|
||||
pkgInstall.getPackageManager = () => {
|
||||
// Use this method if you can't reliably require('nconf') directly
|
||||
try {
|
||||
// Quick & dirty nconf setup
|
||||
fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK);
|
||||
const nconf = require('nconf');
|
||||
const configFile = path.resolve(__dirname, '../../', nconf.any(['config', 'CONFIG']) || 'config.json');
|
||||
nconf.env().file({ // not sure why adding .argv() causes the process to terminate
|
||||
file: configFile,
|
||||
});
|
||||
if (!Object.keys(nconf.stores).length) {
|
||||
// Quick & dirty nconf setup for when you cannot rely on nconf having been required already
|
||||
const configFile = path.resolve(__dirname, '../../', nconf.any(['config', 'CONFIG']) || 'config.json');
|
||||
nconf.env().file({ // not sure why adding .argv() causes the process to terminate
|
||||
file: configFile,
|
||||
});
|
||||
}
|
||||
|
||||
if (nconf.get('package_manager') && !pkgInstall.supportedPackageManager.includes(nconf.get('package_manager'))) {
|
||||
nconf.clear('package_manager');
|
||||
}
|
||||
|
||||
if (!nconf.get('package_manager')) {
|
||||
// Best guess based on lockfile detection
|
||||
try {
|
||||
// use npm if lockfile present
|
||||
fs.accessSync(path.resolve(__dirname, '../../package-lock.json'), fs.constants.R_OK);
|
||||
} catch (e) {
|
||||
nconf.set('package_manager', [
|
||||
// no cnpm detection as it uses same lockfile as npm
|
||||
'yarn.lock', 'pnpm-lock.yaml',
|
||||
].reduce((result, cur) => {
|
||||
if (result) {
|
||||
return result;
|
||||
}
|
||||
|
||||
try {
|
||||
fs.accessSync(path.resolve(__dirname, `../../${cur}`), fs.constants.R_OK);
|
||||
return cur.slice(0, 4);
|
||||
} catch (e) {
|
||||
return result;
|
||||
}
|
||||
}, undefined));
|
||||
}
|
||||
}
|
||||
|
||||
return nconf.get('package_manager') || 'npm';
|
||||
} catch (e) {
|
||||
|
||||
@@ -6,16 +6,13 @@ const cproc = require('child_process');
|
||||
const semver = require('semver');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const nconf = require('nconf');
|
||||
const chalk = require('chalk');
|
||||
|
||||
const { paths, pluginNamePattern } = require('../constants');
|
||||
const pkgInstall = require('./package-install');
|
||||
|
||||
const packageManager = nconf.get('package_manager');
|
||||
|
||||
const supportedPackageManagerList = require('./package-install').supportedPackageManager; // load config from src/cli/package-install.js
|
||||
|
||||
let packageManagerExecutable = supportedPackageManagerList.indexOf(packageManager) >= 0 ? packageManager : 'npm';
|
||||
const packageManager = pkgInstall.getPackageManager();
|
||||
let packageManagerExecutable = packageManager;
|
||||
const packageManagerInstallArgs = packageManager === 'yarn' ? ['add'] : ['install', '--save'];
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
|
||||
@@ -13,10 +13,9 @@ const db = require('../database');
|
||||
const meta = require('../meta');
|
||||
const pubsub = require('../pubsub');
|
||||
const { paths } = require('../constants');
|
||||
const pkgInstall = require('../cli/package-install');
|
||||
|
||||
const supportedPackageManagerList = require('../cli/package-install').supportedPackageManager;
|
||||
// load config from src/cli/package-install.js
|
||||
const packageManager = supportedPackageManagerList.indexOf(nconf.get('package_manager')) >= 0 ? nconf.get('package_manager') : 'npm';
|
||||
const packageManager = pkgInstall.getPackageManager();
|
||||
let packageManagerExecutable = packageManager;
|
||||
const packageManagerCommands = {
|
||||
yarn: {
|
||||
|
||||
Reference in New Issue
Block a user