@lakutata/cli 1.0.12 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/manipulators/CreateDockerFileManipulator.d.ts +3 -0
- package/build/lib/manipulators/CreateDockerFileManipulator.js +82 -0
- package/build/lib/manipulators/CreateDockerFileManipulator.js.map +1 -0
- package/build/lib/menus/manipulateMenus/ManipulateApplicationProject.js +6 -1
- package/build/lib/menus/manipulateMenus/ManipulateApplicationProject.js.map +1 -1
- package/package.json +2 -1
- package/src/lib/manipulators/CreateDockerFileManipulator.ts +81 -0
- package/src/lib/menus/manipulateMenus/ManipulateApplicationProject.ts +6 -1
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CreateDockerFileManipulator = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const moment_timezone_1 = __importDefault(require("moment-timezone"));
|
|
10
|
+
function generateDockerfileContent(timezone, envName, outDir, entryPoint) {
|
|
11
|
+
const dockerFileContents = [
|
|
12
|
+
'FROM node:14-buster-slim',
|
|
13
|
+
'#Set docker timezone',
|
|
14
|
+
`ENV TZ=${timezone}`,
|
|
15
|
+
`ENV NODE_ENV=${envName}`,
|
|
16
|
+
'RUN set -eux',
|
|
17
|
+
'RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime',
|
|
18
|
+
'RUN echo $TZ > /etc/timezone',
|
|
19
|
+
'#Install system level dependencies',
|
|
20
|
+
'RUN npm install -g npm typescript ts-node',
|
|
21
|
+
'#Process project directories',
|
|
22
|
+
'RUN mkdir -p /app',
|
|
23
|
+
'WORKDIR /app',
|
|
24
|
+
'COPY . /app/',
|
|
25
|
+
'RUN rm -rf /app/node_modules',
|
|
26
|
+
`RUN rm -rf ${path_1.default.resolve('/app/', outDir)}`,
|
|
27
|
+
'RUN npm install --build-from-source',
|
|
28
|
+
'RUN tsc',
|
|
29
|
+
'#Expose ports',
|
|
30
|
+
'#Todo export ports or remove this line',
|
|
31
|
+
`ENTRYPOINT node ${path_1.default.resolve('/app/', entryPoint)}`
|
|
32
|
+
];
|
|
33
|
+
let content = '';
|
|
34
|
+
dockerFileContents.forEach(line => {
|
|
35
|
+
content = `${line}\n`;
|
|
36
|
+
});
|
|
37
|
+
return content;
|
|
38
|
+
}
|
|
39
|
+
async function CreateDockerFileManipulator(projectPath, tsConfigFilePath, directories) {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
try {
|
|
42
|
+
const timezone = moment_timezone_1.default.tz.guess();
|
|
43
|
+
const tsConfigJson = JSON.parse(fs_1.default.readFileSync(tsConfigFilePath).toString());
|
|
44
|
+
const outDir = (_a = tsConfigJson === null || tsConfigJson === void 0 ? void 0 : tsConfigJson.compilerOptions) === null || _a === void 0 ? void 0 : _a.outDir;
|
|
45
|
+
if (!outDir)
|
|
46
|
+
return console.error('项目输出目录设置有误');
|
|
47
|
+
const packageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.resolve(projectPath, './package.json')).toString());
|
|
48
|
+
const mainEntry = (packageJson === null || packageJson === void 0 ? void 0 : packageJson.main) ? packageJson.main : '';
|
|
49
|
+
if (!mainEntry)
|
|
50
|
+
return console.error('应用程序主入口设置有误');
|
|
51
|
+
const dockerfiles = {};
|
|
52
|
+
dockerfiles.Dockerfile = generateDockerfileContent(timezone, 'production', outDir, mainEntry);
|
|
53
|
+
if ((_b = packageJson === null || packageJson === void 0 ? void 0 : packageJson.scripts) === null || _b === void 0 ? void 0 : _b.test) {
|
|
54
|
+
const testScriptString = packageJson.scripts.test;
|
|
55
|
+
const testScriptParams = testScriptString.split(' ').reverse();
|
|
56
|
+
let testEntryPoint = '';
|
|
57
|
+
for (const testScriptParam of testScriptParams) {
|
|
58
|
+
const regExp = /src\//;
|
|
59
|
+
if (['.ts', '.js'].includes(path_1.default.extname(testScriptParam)) && regExp.test(testScriptParam)) {
|
|
60
|
+
testEntryPoint = testScriptParam.replace('src/', `${outDir}/`);
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (testEntryPoint) {
|
|
65
|
+
dockerfiles.DockerfileDev = generateDockerfileContent(timezone, 'development', outDir, testEntryPoint);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const dockerfileName of Object.keys(dockerfiles)) {
|
|
69
|
+
fs_1.default.writeFileSync(path_1.default.resolve(projectPath, dockerfileName), dockerfiles[dockerfileName], {
|
|
70
|
+
encoding: 'utf-8',
|
|
71
|
+
flag: 'w'
|
|
72
|
+
});
|
|
73
|
+
console.info(dockerfileName, '写入成功');
|
|
74
|
+
}
|
|
75
|
+
console.info('Dockerfile已创建成功');
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
console.error(`Dockerfile创建错误: ${e.message}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.CreateDockerFileManipulator = CreateDockerFileManipulator;
|
|
82
|
+
//# sourceMappingURL=CreateDockerFileManipulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateDockerFileManipulator.js","sourceRoot":"","sources":["../../../src/lib/manipulators/CreateDockerFileManipulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ const CreateModuleManipulator_1 = require("../../manipulators/CreateModuleManipu
|
|
|
11
11
|
const CreatePluginManipulator_1 = require("../../manipulators/CreatePluginManipulator");
|
|
12
12
|
const CreateThreadManipulator_1 = require("../../manipulators/CreateThreadManipulator");
|
|
13
13
|
const CreateProcessManipulator_1 = require("../../manipulators/CreateProcessManipulator");
|
|
14
|
+
const CreateDockerFileManipulator_1 = require("../../manipulators/CreateDockerFileManipulator");
|
|
14
15
|
async function ManipulateApplicationProject(projectPath, tsConfigFilePath, lakutataProjectInfo) {
|
|
15
16
|
const projectDirectories = lakutataProjectInfo.directories;
|
|
16
17
|
const configuration = lakutataProjectInfo.configuration;
|
|
@@ -24,7 +25,8 @@ async function ManipulateApplicationProject(projectPath, tsConfigFilePath, lakut
|
|
|
24
25
|
{ name: '创建项目模块', value: 'createModule' },
|
|
25
26
|
{ name: '创建项目插件', value: 'createPlugin' },
|
|
26
27
|
{ name: '创建项目线程', value: 'createThread' },
|
|
27
|
-
{ name: '创建项目进程', value: 'createProcess' }
|
|
28
|
+
{ name: '创建项目进程', value: 'createProcess' },
|
|
29
|
+
{ name: '创建DockerFile', value: 'createDockerFile' }
|
|
28
30
|
]
|
|
29
31
|
}]);
|
|
30
32
|
switch (opt.opr) {
|
|
@@ -46,6 +48,9 @@ async function ManipulateApplicationProject(projectPath, tsConfigFilePath, lakut
|
|
|
46
48
|
case 'createProcess': {
|
|
47
49
|
return await (0, CreateProcessManipulator_1.CreateProcessManipulator)(projectPath, tsConfigFilePath, projectDirectories);
|
|
48
50
|
}
|
|
51
|
+
case 'createDockerFile': {
|
|
52
|
+
return await (0, CreateDockerFileManipulator_1.CreateDockerFileManipulator)(projectPath, tsConfigFilePath, projectDirectories);
|
|
53
|
+
}
|
|
49
54
|
default: {
|
|
50
55
|
return console.error('无效的操作选项');
|
|
51
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ManipulateApplicationProject.js","sourceRoot":"","sources":["../../../../src/lib/menus/manipulateMenus/ManipulateApplicationProject.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA+B;AAC/B,4GAAsG;AACtG,8FAAwF;AACxF,wFAAkF;AAClF,wFAAkF;AAClF,wFAAkF;AAClF,0FAAoF;
|
|
1
|
+
{"version":3,"file":"ManipulateApplicationProject.js","sourceRoot":"","sources":["../../../../src/lib/menus/manipulateMenus/ManipulateApplicationProject.ts"],"names":[],"mappings":";;;;;;AAAA,wDAA+B;AAC/B,4GAAsG;AACtG,8FAAwF;AACxF,wFAAkF;AAClF,wFAAkF;AAClF,wFAAkF;AAClF,0FAAoF;AACpF,gGAA0F;AASnF,KAAK,UAAU,4BAA4B,CAAC,WAAmB,EAAE,gBAAwB,EAAE,mBAAwB;IACtH,MAAM,kBAAkB,GAA+B,mBAAmB,CAAC,WAAW,CAAA;IACtF,MAAM,aAAa,GAAW,mBAAmB,CAAC,aAAa,CAAA;IAC/D,MAAM,GAAG,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,YAAY;YACrB,OAAO,EAAE;gBACL,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAC;gBACvC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,EAAC;gBAC1C,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAC;gBACvC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAC;gBACvC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAC;gBACvC,EAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAC;gBACxC,EAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,kBAAkB,EAAC;aACpD;SACJ,CAAC,CAAC,CAAA;IACH,QAAQ,GAAG,CAAC,GAAG,EAAE;QACb,KAAK,cAAc,CAAC,CAAC;YACjB,OAAO,MAAM,IAAA,yDAA2B,EAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAA;SACzF;QACD,KAAK,iBAAiB,CAAC,CAAC;YACpB,OAAO,MAAM,IAAA,uDAA0B,EAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;SAC7F;QACD,KAAK,cAAc,CAAC,CAAC;YACjB,OAAO,MAAM,IAAA,iDAAuB,EAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;SAC1F;QACD,KAAK,cAAc,CAAC,CAAC;YACjB,OAAO,MAAM,IAAA,iDAAuB,EAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;SAC1F;QACD,KAAK,cAAc,CAAC,CAAC;YACjB,OAAO,MAAM,IAAA,iDAAuB,EAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;SAC1F;QACD,KAAK,eAAe,CAAC,CAAC;YAClB,OAAO,MAAM,IAAA,mDAAwB,EAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;SAC3F;QACD,KAAK,kBAAkB,CAAC,CAAC;YACrB,OAAO,MAAM,IAAA,yDAA2B,EAAC,WAAW,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAA;SAC9F;QACD,OAAO,CAAC,CAAC;YACL,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;SAClC;KACJ;AACL,CAAC;AA3CD,oEA2CC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lakutata/cli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.13",
|
|
4
4
|
"description": "Lakutata CLI Tool",
|
|
5
5
|
"main": "./build/CLI.js",
|
|
6
6
|
"types": "./build/CLI.d.ts",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"inquirer": "^8.2.0",
|
|
37
37
|
"latest-version": "^5.1.0",
|
|
38
|
+
"moment-timezone": "^0.5.34",
|
|
38
39
|
"semver": "^7.3.5",
|
|
39
40
|
"shelljs": "^0.8.5",
|
|
40
41
|
"simple-git": "^2.48.0",
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import moment from 'moment-timezone'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 生成Dockerfile文件内容
|
|
7
|
+
* @param timezone
|
|
8
|
+
* @param envName
|
|
9
|
+
* @param outDir
|
|
10
|
+
* @param entryPoint
|
|
11
|
+
*/
|
|
12
|
+
function generateDockerfileContent(timezone: string, envName: string, outDir: string, entryPoint: string): string {
|
|
13
|
+
const dockerFileContents: string[] = [
|
|
14
|
+
'FROM node:14-buster-slim',
|
|
15
|
+
'#Set docker timezone',
|
|
16
|
+
`ENV TZ=${timezone}`,
|
|
17
|
+
`ENV NODE_ENV=${envName}`,
|
|
18
|
+
'RUN set -eux',
|
|
19
|
+
'RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime',
|
|
20
|
+
'RUN echo $TZ > /etc/timezone',
|
|
21
|
+
'#Install system level dependencies',
|
|
22
|
+
'RUN npm install -g npm typescript ts-node',
|
|
23
|
+
'#Process project directories',
|
|
24
|
+
'RUN mkdir -p /app',
|
|
25
|
+
'WORKDIR /app',
|
|
26
|
+
'COPY . /app/',
|
|
27
|
+
'RUN rm -rf /app/node_modules',
|
|
28
|
+
`RUN rm -rf ${path.resolve('/app/', outDir)}`,
|
|
29
|
+
'RUN npm install --build-from-source',
|
|
30
|
+
'RUN tsc',
|
|
31
|
+
'#Expose ports',
|
|
32
|
+
'#Todo export ports or remove this line',
|
|
33
|
+
`ENTRYPOINT node ${path.resolve('/app/', entryPoint)}`
|
|
34
|
+
]
|
|
35
|
+
let content: string = ''
|
|
36
|
+
dockerFileContents.forEach(line => {
|
|
37
|
+
content = `${line}\n`
|
|
38
|
+
})
|
|
39
|
+
return content
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export async function CreateDockerFileManipulator(projectPath: string, tsConfigFilePath: string, directories: { [name: string]: string }) {
|
|
43
|
+
try {
|
|
44
|
+
const timezone = moment.tz.guess()
|
|
45
|
+
const tsConfigJson = JSON.parse(fs.readFileSync(tsConfigFilePath).toString())
|
|
46
|
+
const outDir: string = tsConfigJson?.compilerOptions?.outDir
|
|
47
|
+
if (!outDir) return console.error('项目输出目录设置有误')
|
|
48
|
+
const packageJson = JSON.parse(fs.readFileSync(path.resolve(projectPath, './package.json')).toString())
|
|
49
|
+
const mainEntry: string = packageJson?.main ? packageJson.main : ''
|
|
50
|
+
if (!mainEntry) return console.error('应用程序主入口设置有误')
|
|
51
|
+
const dockerfiles: { [key: string]: string } = {}
|
|
52
|
+
dockerfiles.Dockerfile = generateDockerfileContent(timezone, 'production', outDir, mainEntry)
|
|
53
|
+
if (packageJson?.scripts?.test) {
|
|
54
|
+
//有测试主入口
|
|
55
|
+
const testScriptString: string = packageJson.scripts.test
|
|
56
|
+
const testScriptParams: string[] = testScriptString.split(' ').reverse()
|
|
57
|
+
let testEntryPoint: string = ''
|
|
58
|
+
for (const testScriptParam of testScriptParams) {
|
|
59
|
+
const regExp = /src\//
|
|
60
|
+
if (['.ts', '.js'].includes(path.extname(testScriptParam)) && regExp.test(testScriptParam)) {
|
|
61
|
+
testEntryPoint = testScriptParam.replace('src/', `${outDir}/`)
|
|
62
|
+
break
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (testEntryPoint) {
|
|
66
|
+
dockerfiles.DockerfileDev = generateDockerfileContent(timezone, 'development', outDir, testEntryPoint)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
for (const dockerfileName of Object.keys(dockerfiles)) {
|
|
70
|
+
//生成文件
|
|
71
|
+
fs.writeFileSync(path.resolve(projectPath, dockerfileName), dockerfiles[dockerfileName], {
|
|
72
|
+
encoding: 'utf-8',
|
|
73
|
+
flag: 'w'
|
|
74
|
+
})
|
|
75
|
+
console.info(dockerfileName, '写入成功')
|
|
76
|
+
}
|
|
77
|
+
console.info('Dockerfile已创建成功')
|
|
78
|
+
} catch (e) {
|
|
79
|
+
console.error(`Dockerfile创建错误: ${(e as Error).message}`)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -5,6 +5,7 @@ import {CreateModuleManipulator} from '../../manipulators/CreateModuleManipulato
|
|
|
5
5
|
import {CreatePluginManipulator} from '../../manipulators/CreatePluginManipulator'
|
|
6
6
|
import {CreateThreadManipulator} from '../../manipulators/CreateThreadManipulator'
|
|
7
7
|
import {CreateProcessManipulator} from '../../manipulators/CreateProcessManipulator'
|
|
8
|
+
import {CreateDockerFileManipulator} from '../../manipulators/CreateDockerFileManipulator'
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* 操作应用程序项目
|
|
@@ -26,7 +27,8 @@ export async function ManipulateApplicationProject(projectPath: string, tsConfig
|
|
|
26
27
|
{name: '创建项目模块', value: 'createModule'},
|
|
27
28
|
{name: '创建项目插件', value: 'createPlugin'},
|
|
28
29
|
{name: '创建项目线程', value: 'createThread'},
|
|
29
|
-
{name: '创建项目进程', value: 'createProcess'}
|
|
30
|
+
{name: '创建项目进程', value: 'createProcess'},
|
|
31
|
+
{name: '创建DockerFile', value: 'createDockerFile'}
|
|
30
32
|
]
|
|
31
33
|
}])
|
|
32
34
|
switch (opt.opr) {
|
|
@@ -48,6 +50,9 @@ export async function ManipulateApplicationProject(projectPath: string, tsConfig
|
|
|
48
50
|
case 'createProcess': {
|
|
49
51
|
return await CreateProcessManipulator(projectPath, tsConfigFilePath, projectDirectories)
|
|
50
52
|
}
|
|
53
|
+
case 'createDockerFile': {
|
|
54
|
+
return await CreateDockerFileManipulator(projectPath, tsConfigFilePath, projectDirectories)
|
|
55
|
+
}
|
|
51
56
|
default: {
|
|
52
57
|
return console.error('无效的操作选项')
|
|
53
58
|
}
|