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 = () => {
|
pkgInstall.getPackageManager = () => {
|
||||||
// Use this method if you can't reliably require('nconf') directly
|
|
||||||
try {
|
try {
|
||||||
// Quick & dirty nconf setup
|
|
||||||
fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK);
|
fs.accessSync(path.join(paths.nodeModules, 'nconf/package.json'), fs.constants.R_OK);
|
||||||
const nconf = require('nconf');
|
const nconf = require('nconf');
|
||||||
const configFile = path.resolve(__dirname, '../../', nconf.any(['config', 'CONFIG']) || 'config.json');
|
if (!Object.keys(nconf.stores).length) {
|
||||||
nconf.env().file({ // not sure why adding .argv() causes the process to terminate
|
// Quick & dirty nconf setup for when you cannot rely on nconf having been required already
|
||||||
file: configFile,
|
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';
|
return nconf.get('package_manager') || 'npm';
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -6,16 +6,13 @@ const cproc = require('child_process');
|
|||||||
const semver = require('semver');
|
const semver = require('semver');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const nconf = require('nconf');
|
|
||||||
const chalk = require('chalk');
|
const chalk = require('chalk');
|
||||||
|
|
||||||
const { paths, pluginNamePattern } = require('../constants');
|
const { paths, pluginNamePattern } = require('../constants');
|
||||||
|
const pkgInstall = require('./package-install');
|
||||||
|
|
||||||
const packageManager = nconf.get('package_manager');
|
const packageManager = pkgInstall.getPackageManager();
|
||||||
|
let packageManagerExecutable = packageManager;
|
||||||
const supportedPackageManagerList = require('./package-install').supportedPackageManager; // load config from src/cli/package-install.js
|
|
||||||
|
|
||||||
let packageManagerExecutable = supportedPackageManagerList.indexOf(packageManager) >= 0 ? packageManager : 'npm';
|
|
||||||
const packageManagerInstallArgs = packageManager === 'yarn' ? ['add'] : ['install', '--save'];
|
const packageManagerInstallArgs = packageManager === 'yarn' ? ['add'] : ['install', '--save'];
|
||||||
|
|
||||||
if (process.platform === 'win32') {
|
if (process.platform === 'win32') {
|
||||||
|
|||||||
@@ -13,10 +13,9 @@ const db = require('../database');
|
|||||||
const meta = require('../meta');
|
const meta = require('../meta');
|
||||||
const pubsub = require('../pubsub');
|
const pubsub = require('../pubsub');
|
||||||
const { paths } = require('../constants');
|
const { paths } = require('../constants');
|
||||||
|
const pkgInstall = require('../cli/package-install');
|
||||||
|
|
||||||
const supportedPackageManagerList = require('../cli/package-install').supportedPackageManager;
|
const packageManager = pkgInstall.getPackageManager();
|
||||||
// load config from src/cli/package-install.js
|
|
||||||
const packageManager = supportedPackageManagerList.indexOf(nconf.get('package_manager')) >= 0 ? nconf.get('package_manager') : 'npm';
|
|
||||||
let packageManagerExecutable = packageManager;
|
let packageManagerExecutable = packageManager;
|
||||||
const packageManagerCommands = {
|
const packageManagerCommands = {
|
||||||
yarn: {
|
yarn: {
|
||||||
|
|||||||
Reference in New Issue
Block a user