Commit 897a95df authored by nanahira's avatar nanahira

use execFile and support org plugin

parent e81bad5b
import fs from 'fs';
import { Logger } from 'koishi';
import { exec } from 'child_process';
import { execFile } from 'child_process';
import { promisify } from 'util';
import path from 'path';
import { getPackageJsonPackages } from './utils/read-package-json';
import { loadConfig } from './utils/load-config';
import { Loader } from "@koishijs/cli";
import ConfigLoader from "@koishijs/loader";
import { KoishiConfig, PluginInstallConfig } from "./def/interfaces";
const execAsync = promisify(exec);
import ConfigLoader from '@koishijs/loader';
import { KoishiConfig } from './def/interfaces';
const execFileAsync = promisify(execFile);
const logger = new Logger('bootstrap-install-plugin');
......@@ -41,7 +39,13 @@ async function checkPluginExists(
async function npmInstall(name: string) {
logger.info(`Installing package ${name}.`);
try {
await execAsync(`npm install --save-exact --loglevel error ${name}`);
await execFileAsync('npm', [
'install',
'--save-exact',
'--loglevel',
'error',
name,
]);
logger.info(`Package ${name} installed.`);
return true;
} catch (e) {
......@@ -95,8 +99,11 @@ async function installPlugin(name: string, info: any) {
installList.push(`${name}@${installVersion}`);
} else if (name.startsWith('@') && name.includes('/')) {
const [author, pluginName] = name.split('/');
const installName = pluginName.startsWith(communityPrefix)
? pluginName
: `${communityPrefix}${pluginName}`;
installList.push(
`${author}/${communityPrefix}${pluginName}@${installVersion}`,
`${author}/${communityPrefix}${installName}@${installVersion}`,
);
} else {
if (allowOfficial) {
......@@ -124,10 +131,11 @@ export async function installPluginEntry() {
logger.warn(`No plugins found, exiting.`);
return;
}
console.log(config.plugins);
logger.info(`Cleaning NPM cache.`);
await execAsync(`npm cache clean --force`);
await execFileAsync('npm', ['cache', 'clean', '--force']);
for (const [name, info] of Object.entries(plugins)) {
if (!info.$install || !info.$version) {
if (!info.$install && !info.$version) {
continue;
}
await installPlugin(name, info);
......
import path from 'path';
import fs from 'fs';
import { loadConfig } from './utils/load-config';
import { Logger } from 'koishi';
import ConfigLoader from '@koishijs/loader';
import { KoishiConfig } from './def/interfaces';
const logger = new Logger('bootstrap-prod');
......@@ -22,7 +23,7 @@ async function handlePackageEntry(packagePath: string) {
export async function prodEntry() {
logger.info(`Running production preparations...`);
const config = await loadConfig();
const config = new ConfigLoader<KoishiConfig>().readConfig();
const plugins = config?.plugins;
if (!plugins) {
logger.warn(`No plugins found, exiting.`);
......
import { KoishiConfig } from '../def/interfaces';
import yaml from 'yaml';
import fs from 'fs';
import path from 'path';
import loadJsonFile from 'load-json-file';
import { Logger } from 'koishi';
const logger = new Logger('bootstrap-config-loader');
async function loadFromYaml(): Promise<KoishiConfig> {
return yaml.parse(await fs.promises.readFile('./koishi.config.yml', 'utf-8'));
}
function loadFromJs(): KoishiConfig {
return require(path.join(process.cwd(), 'koishi.config.js'));
}
async function loadFromJson(): Promise<KoishiConfig> {
return await loadJsonFile('./koishi.config.json');
}
export async function loadConfig(): Promise<KoishiConfig | undefined> {
try {
logger.info(`Reading config from ./koishi.config.yml.`);
return await loadFromYaml();
} catch (e) {
logger.warn(
`Failed reading from YAML: ${(e as any).toString()} , trying JS.`,
);
logger.info(`Reading config from ./koishi.config.js.`);
try {
return loadFromJs();
} catch (e) {
logger.warn(
`Failed reading from JS: ${(e as any).toString()} , trying JSON.`,
);
logger.info(`Reading config from ./koishi.config.json.`);
try {
return await loadFromJson();
} catch (e) {
logger.warn(
`Failed reading from JSON: ${(e as any).toString()} , exiting.`,
);
return;
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment