@lazycatcloud/lzc-cli 1.2.21 → 1.2.24

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.
@@ -2,22 +2,27 @@ import { spawn, spawnSync } from "child_process";
2
2
  import fs from "node:fs";
3
3
  import shellApi from "../shellapi.js";
4
4
  import inquirer from "inquirer";
5
+ import { isDebugMode } from "../utils.js";
5
6
 
6
7
  export class DebugBridge {
7
8
  constructor() {
8
9
  this.uid = shellApi.uid;
9
10
  this.boxname = shellApi.boxname;
10
- this.sshCmd = `ssh -p 22222 box@dev.${this.boxname}.heiyu.space`;
11
+ this.sshCmd = `ssh ${isDebugMode() ? "-vv" : ""} -p 22222 box@dev.${
12
+ this.boxname
13
+ }.heiyu.space`;
11
14
  }
12
15
 
13
16
  common(cmd, args) {
14
17
  const ssh = spawnSync(cmd, args, {
15
18
  shell: true,
16
19
  encoding: "utf-8",
17
- stdio: "pipe",
20
+ stdio: ["pipe", "pipe", "inherit"],
18
21
  });
19
22
  return new Promise((resolve, reject) => {
20
- ssh.status == 0 ? resolve(ssh.stdout) : reject(ssh.stderr);
23
+ ssh.status == 0
24
+ ? resolve(ssh.stdout)
25
+ : reject(`执行命令 ${cmd} ${args.join(" ")} 出错\n${ssh.stderr ?? ""}`);
21
26
  });
22
27
  }
23
28
 
@@ -17,6 +17,7 @@ import {
17
17
  FileLocker,
18
18
  isUserApp,
19
19
  createTemplateFileCommon,
20
+ isDebugMode,
20
21
  } from "../utils.js";
21
22
  import os from "node:os";
22
23
  import commandExists from "command-exists";
@@ -418,7 +419,7 @@ class DevShell {
418
419
  "-o", `"UserKnownHostsFile=/dev/null"`,
419
420
  "-o", `"ConnectionAttempts=3"`,
420
421
  "-o", `"ConnectTimeout=30"`,
421
- "-o", `"LogLevel=ERROR"`,
422
+ "-o", `${isDebugMode() ? '"LogLevel=DEBUG"' :'"LogLevel=ERROR"'}`,
422
423
  ].join(" ");
423
424
  // 检查rsync工具是否存在:提示用户
424
425
  const rsyncExisted = commandExists.sync("rsync");
@@ -427,14 +428,14 @@ class DevShell {
427
428
  process.exit(1);
428
429
  }
429
430
 
430
- const rsyncDebug = process.env.RSYNCDEBUG ? "-P" : "";
431
+ const rsyncDebug = isDebugMode() ? "-P" : "";
431
432
  const host = this.isUserApp
432
433
  ? `${shellApi.uid}.app.${appId}.lzcapp`
433
434
  : `app.${appId}.lzcapp`;
434
435
  const dest = `root@${host}:/lzcapp/cache/devshell`;
435
436
  try {
436
437
  execSync(
437
- `rsync ${rsyncDebug} --rsh='${rsh}' --recursive --relative --perms --update --filter=':- .gitignore' --ignore-errors . ${dest}`,
438
+ `rsync ${rsyncDebug} --rsh='${rsh}' --recursive --relative --perms --update -F --filter=':- .gitignore' --ignore-errors . ${dest}`,
438
439
  { stdio: ["ignore", "inherit", "inherit"] }
439
440
  );
440
441
  } catch (err) {
@@ -10,7 +10,7 @@ export async function collectContextFromDockerFile(contextDir, dockerfilePath) {
10
10
  throw "未发现 Dockerfile";
11
11
  }
12
12
 
13
- let src = [path.relative(contextDir, dockerfilePath)];
13
+ let src = [];
14
14
 
15
15
  // 通过 COPY 和 ADD 获取所有context中的文件
16
16
  const ast = DockerfileParser.parse(fs.readFileSync(dockerfilePath, "utf8"));
@@ -47,9 +47,8 @@ export async function collectContextFromDockerFile(contextDir, dockerfilePath) {
47
47
  src = ig.filter(src);
48
48
  }
49
49
 
50
- return await tarContentDir(
51
- src,
52
- path.join(contextDir, "lzc-build-image-context.tar"),
53
- contextDir
54
- );
50
+ const dockerfile = path.relative(contextDir, dockerfilePath);
51
+ src.push(dockerfile); // DON'T IGNORE DOCKERFILE
52
+ const output = path.join(contextDir, "lzc-build-image-context.tar");
53
+ return await tarContentDir(src, output, contextDir);
55
54
  }
@@ -1,4 +1,5 @@
1
1
  import { Publish } from "./publish.js";
2
+ import { PrePublish } from "./prePublish.js";
2
3
  import { reLogin } from "./login.js";
3
4
  import fs from "node:fs";
4
5
 
@@ -11,6 +12,34 @@ export function appstoreCommand(program) {
11
12
  await reLogin();
12
13
  },
13
14
  },
15
+ {
16
+ command: "pre-publish <pkgPath>",
17
+ desc: "发布到内测",
18
+ builder: (args) => {
19
+ args.option("c", {
20
+ alias: "changelog",
21
+ describe: "更改日志",
22
+ type: "string",
23
+ });
24
+ args.option("F", {
25
+ alias: "file",
26
+ describe: "更改日志文件",
27
+ type: "string",
28
+ });
29
+ args.option("G", {
30
+ alias: "gid",
31
+ describe: "内测组ID",
32
+ type: "string",
33
+ });
34
+ },
35
+ handler: async ({ pkgPath, changelog, file, gid }) => {
36
+ const p = new PrePublish();
37
+ if (!changelog && file) {
38
+ changelog = fs.readFileSync(file, "utf8");
39
+ }
40
+ await p.publish(pkgPath, changelog, gid);
41
+ },
42
+ },
14
43
  {
15
44
  command: "publish <pkgPath>",
16
45
  desc: "发布到商店",
@@ -0,0 +1,145 @@
1
+ import { request, autoLogin } from "./login.js";
2
+ import logger from "loglevel";
3
+ import FormData from "form-data";
4
+ import fs from "node:fs";
5
+ import inquirer from "inquirer";
6
+ import { spawnSync } from "node:child_process";
7
+ import path from "node:path";
8
+ import { isFileExist, isPngWithFile } from "../utils.js";
9
+ import env from "../env.js";
10
+
11
+ async function askChangeLog() {
12
+ const noEmpty = (value) => value != "";
13
+ return await inquirer.prompt([
14
+ {
15
+ name: "changelog",
16
+ type: "editor",
17
+ message: "填写 changelog 内容",
18
+ validate: noEmpty,
19
+ },
20
+ ]);
21
+ }
22
+
23
+ async function askGroup(choices) {
24
+ return (
25
+ await inquirer.prompt([
26
+ {
27
+ name: "type",
28
+ message: "选择内测组",
29
+ type: "list",
30
+ choices,
31
+ },
32
+ ])
33
+ )["type"];
34
+ }
35
+
36
+ export class PrePublish {
37
+ constructor(baseUrl = "https://testflight.lazycat.cloud/api") {
38
+ this.baseUrl = baseUrl;
39
+ }
40
+
41
+ /**
42
+ * @param {string} raw
43
+ */
44
+ isJSON(raw) {
45
+ const ml = raw.length;
46
+ if (ml <= 1) return false;
47
+ return raw[0] == "{" && raw[ml - 1] == "}";
48
+ }
49
+
50
+ preCheck(pkgPath) {
51
+ const tempDir = fs.mkdtempSync(".lzc-cli-publish");
52
+ try {
53
+ spawnSync("unzip", ["-d", tempDir, pkgPath]);
54
+ if (isFileExist(path.join(tempDir, "devshell"))) {
55
+ logger.error(
56
+ "不能发布一个devshell的版本,请重新使用 `lzc-cli project build` 构建"
57
+ );
58
+ return false;
59
+ }
60
+ const tempIcon = path.join(tempDir, "icon.png");
61
+ if (!isFileExist(tempIcon) || !isPngWithFile(tempIcon)) {
62
+ logger.error("icon 必须是 png 格式");
63
+ return false;
64
+ }
65
+ return true;
66
+ } finally {
67
+ fs.rmSync(tempDir, { recursive: true });
68
+ }
69
+ }
70
+
71
+ async getDict() {
72
+ const url = this.baseUrl + "/groups/dict";
73
+ const token = env.get("token");
74
+ const res = await request(url, {
75
+ method: "GET",
76
+ headers: {
77
+ Authorization: `Bearer ${token}`,
78
+ },
79
+ });
80
+ const text = (await res.text()).trim();
81
+ if (!this.isJSON(text)) {
82
+ logger.error(`parse error: dict resp text not is json`);
83
+ return;
84
+ }
85
+ const respJson = await JSON.parse(text);
86
+ return respJson.data || [];
87
+ }
88
+
89
+ async upload(groupId, changelog, pkgPath) {
90
+ const form = new FormData();
91
+ form.append("type", "Lpk");
92
+ form.append("changelog", changelog);
93
+ form.append("file", fs.createReadStream(pkgPath));
94
+
95
+ const url = this.baseUrl + `/group/${groupId}/upload`;
96
+ const token = env.get("token");
97
+ const res = await request(url, {
98
+ method: "POST",
99
+ body: form,
100
+ headers: {
101
+ Authorization: `Bearer ${token}`,
102
+ },
103
+ });
104
+ const text = (await res.text()).trim();
105
+ if (!this.isJSON(text)) {
106
+ logger.error(`parse error: upload resp text not is json`);
107
+ return;
108
+ }
109
+ const respJson = await JSON.parse(text);
110
+ logger.debug("upload lpk response", respJson);
111
+ return respJson;
112
+ }
113
+
114
+ /**
115
+ * @param {string} pkgPath
116
+ * @param {string} changelog
117
+ */
118
+ async publish(pkgPath, changelog, gid) {
119
+ if (!this.preCheck(pkgPath)) return;
120
+
121
+ await autoLogin();
122
+
123
+ if (!gid) {
124
+ const groups = await this.getDict();
125
+ const groupName = await askGroup(groups.map((it) => it.name));
126
+ gid = groups.find((it) => it.name == groupName)?.id;
127
+ }
128
+ if (!gid) {
129
+ logger.error("请选择内测组");
130
+ return;
131
+ }
132
+ if (!changelog) {
133
+ const answer = await askChangeLog();
134
+ changelog = answer.changelog;
135
+ }
136
+ changelog = changelog.trim(); // clean space ^:)
137
+ logger.info("正在提交内测...");
138
+ const resp = await this.upload(gid, changelog, pkgPath);
139
+ if (resp.success) {
140
+ logger.info("应用提交成功! 请在内测工具中查看");
141
+ } else {
142
+ logger.error(`应用提交失败: ${resp.msg}`);
143
+ }
144
+ }
145
+ }
@@ -25,12 +25,12 @@ export class Publish {
25
25
  }
26
26
 
27
27
  /**
28
- * @param {string} raw
28
+ * @param {string} raw
29
29
  */
30
30
  isJSON(raw) {
31
- const ml = raw.length
32
- if (ml <= 1) return false
33
- return raw[0] == '{' && raw[ml - 1] == '}'
31
+ const ml = raw.length;
32
+ if (ml <= 1) return false;
33
+ return raw[0] == "{" && raw[ml - 1] == "}";
34
34
  }
35
35
 
36
36
  preCheck(pkgPath) {
@@ -38,26 +38,28 @@ export class Publish {
38
38
  try {
39
39
  spawnSync("unzip", ["-d", tempDir, pkgPath]);
40
40
  if (isFileExist(path.join(tempDir, "devshell"))) {
41
- logger.error("不能发布一个devshell的版本,请重新使用 `lzc-cli project build` 构建")
42
- return false
41
+ logger.error(
42
+ "不能发布一个devshell的版本,请重新使用 `lzc-cli project build` 构建"
43
+ );
44
+ return false;
43
45
  }
44
- const tempIcon = path.join(tempDir, "icon.png")
46
+ const tempIcon = path.join(tempDir, "icon.png");
45
47
  if (!isFileExist(tempIcon) || !isPngWithFile(tempIcon)) {
46
- logger.error("icon 必须是 png 格式")
47
- return false
48
+ logger.error("icon 必须是 png 格式");
49
+ return false;
48
50
  }
49
- return true
51
+ return true;
50
52
  } finally {
51
53
  fs.rmSync(tempDir, { recursive: true });
52
54
  }
53
55
  }
54
56
 
55
57
  /**
56
- * @param {string} pkgPath
57
- * @param {string} changelog
58
+ * @param {string} pkgPath
59
+ * @param {string} changelog
58
60
  */
59
61
  async publish(pkgPath, changelog) {
60
- if (!this.preCheck(pkgPath)) return
62
+ if (!this.preCheck(pkgPath)) return;
61
63
 
62
64
  await autoLogin();
63
65
 
@@ -65,39 +67,40 @@ export class Publish {
65
67
  const answer = await askChangeLog();
66
68
  changelog = answer.changelog;
67
69
  }
68
- changelog = changelog.trim() // clean space ^:)
70
+ changelog = changelog.trim(); // clean space ^:)
69
71
 
70
72
  logger.info("正在提交审核...");
71
73
  const form = new FormData();
72
74
  form.append("file", fs.createReadStream(pkgPath));
73
75
 
74
- const uploadURL = this.baseUrl + "/upload_lpk"
75
- logger.debug("upload url is", uploadURL)
76
+ const uploadURL = this.baseUrl + "/upload_lpk";
77
+ logger.debug("upload url is", uploadURL);
76
78
 
77
79
  const res = await request(uploadURL, {
78
80
  method: "POST",
79
81
  body: form,
80
82
  });
81
- const text = (await res.text()).trim()
83
+ const text = (await res.text()).trim();
82
84
  if (!this.isJSON(text)) {
83
85
  logger.info("upload lpk fail", text);
84
- return
86
+ return;
85
87
  }
86
- const lpkInfo = await JSON.parse(text)
88
+ const lpkInfo = await JSON.parse(text);
87
89
  logger.debug("upload lpk response", lpkInfo);
88
90
 
89
- const sendURL = this.baseUrl + `/apps/${lpkInfo.package}/reviews`
90
- logger.debug("publish url is", sendURL)
91
+ const sendURL = this.baseUrl + `/apps/${lpkInfo.package}/reviews`;
92
+ logger.debug("publish url is", sendURL);
91
93
 
92
94
  const formData = {
93
95
  changelog,
96
+ name: lpkInfo.name,
94
97
  iconPath: lpkInfo.iconPath,
95
98
  pkgPath: lpkInfo.url,
96
99
  supportPC: lpkInfo.supportPC,
97
100
  supportMobile: lpkInfo.supportMobile,
98
- }
101
+ };
99
102
 
100
- logger.debug("form data is", formData)
103
+ logger.debug("form data is", formData);
101
104
 
102
105
  return request(sendURL, {
103
106
  method: "POST",
package/lib/shellapi.js CHANGED
@@ -14,12 +14,13 @@ const bannerfileContent = `˄=ᆽ=ᐟ \\`;
14
14
  */
15
15
  function getShellAPIConfigDir() {
16
16
  const home = os.homedir();
17
- const isMacos = process.platform == "darwin";
18
- let sufix = "/.config/hportal-client";
19
- if (isMacos) {
20
- sufix = "/Library/Application Support/hportal-client";
21
- } // TODO: need reimpl fetch windows
22
- const SHELLAPI_CONFIG_DIR = path.join(home, sufix);
17
+ let suffix = "/.config/hportal-client";
18
+ if (process.platform === "darwin") {
19
+ suffix = "/Library/Application Support/hportal-client";
20
+ } else if (process.platform === "win32") {
21
+ suffix = "\\AppData\\Roaming\\hportal-client";
22
+ }
23
+ const SHELLAPI_CONFIG_DIR = path.join(home, suffix);
23
24
  return SHELLAPI_CONFIG_DIR;
24
25
  }
25
26
 
@@ -113,10 +114,7 @@ class ShellApi {
113
114
  }
114
115
  })
115
116
  .catch(() => {
116
- const skip = process.env.SKIP_CHECK_DEVTOOLS;
117
- if (skip != "1") {
118
- logger.warn(`你的懒猫微服开发者工具版本较低,请从商店中更新`);
119
- }
117
+ logger.debug(`你的懒猫微服开发者工具版本较低,请从商店中更新`);
120
118
  });
121
119
  }
122
120
 
package/lib/utils.js CHANGED
@@ -14,7 +14,7 @@ import zlib from "node:zlib";
14
14
  import process from "node:process";
15
15
  import { spawnSync } from "node:child_process";
16
16
  import logger from "loglevel";
17
- import tar from "tar";
17
+ import * as tar from "tar";
18
18
 
19
19
  export const envsubstr = async (templateContents, args) => {
20
20
  const parse = await importDefault("envsub/js/envsub-parser.js");
@@ -61,7 +61,7 @@ export function dumpToYaml(template, target) {
61
61
  styles: {
62
62
  "!!null": "empty", // dump null as ""
63
63
  },
64
- })
64
+ }),
65
65
  );
66
66
  }
67
67
 
@@ -89,7 +89,7 @@ export async function envTemplateFile(templateFile, env) {
89
89
  "!!null": "empty", // dump null as ""
90
90
  },
91
91
  }),
92
- { options }
92
+ { options },
93
93
  );
94
94
  }
95
95
 
@@ -173,7 +173,7 @@ export function isFileExist(path) {
173
173
  try {
174
174
  fs.accessSync(
175
175
  path,
176
- fs.constants.W_OK | fs.constants.R_OK | fs.constants.F_OK
176
+ fs.constants.W_OK | fs.constants.R_OK | fs.constants.F_OK,
177
177
  );
178
178
  return true;
179
179
  } catch {
@@ -220,7 +220,7 @@ export class Downloader {
220
220
  received +
221
221
  " bytes downloaded out of " +
222
222
  total +
223
- " bytes."
223
+ " bytes.",
224
224
  );
225
225
  }
226
226
 
@@ -329,7 +329,7 @@ export async function tarContentDir(from, to, cwd = "./") {
329
329
  gid: 0,
330
330
  },
331
331
  },
332
- from
332
+ from,
333
333
  )
334
334
  .pipe(dest)
335
335
  .on("close", () => {
@@ -345,25 +345,31 @@ export async function tarContentDir(from, to, cwd = "./") {
345
345
  /**
346
346
  * check buffer is png(magic header)
347
347
  * refer: https://github.com/sindresorhus/is-png/blob/main/index.js
348
- * @param {Buffer} buffer
348
+ * @param {Buffer} buffer
349
349
  * @returns {boolean}
350
350
  */
351
351
  function isPngWithBuffer(buffer) {
352
- if (!buffer || buffer.length < 8) {
353
- return false;
354
- }
355
- return buffer[0] === 0x89
356
- && buffer[1] === 0x50
357
- && buffer[2] === 0x4E
358
- && buffer[3] === 0x47
359
- && buffer[4] === 0x0D
360
- && buffer[5] === 0x0A
361
- && buffer[6] === 0x1A
362
- && buffer[7] === 0x0A;
352
+ if (!buffer || buffer.length < 8) {
353
+ return false;
354
+ }
355
+ return (
356
+ buffer[0] === 0x89 &&
357
+ buffer[1] === 0x50 &&
358
+ buffer[2] === 0x4e &&
359
+ buffer[3] === 0x47 &&
360
+ buffer[4] === 0x0d &&
361
+ buffer[5] === 0x0a &&
362
+ buffer[6] === 0x1a &&
363
+ buffer[7] === 0x0a
364
+ );
363
365
  }
364
366
 
365
367
  export function isPngWithFile(filepath) {
366
- if (!isFileExist(filepath)) return false
367
- const buf = fs.readFileSync(filepath)
368
- return isPngWithBuffer(buf)
369
- }
368
+ if (!isFileExist(filepath)) return false;
369
+ const buf = fs.readFileSync(filepath);
370
+ return isPngWithBuffer(buf);
371
+ }
372
+
373
+ export function isDebugMode() {
374
+ return logger.getLevel() <= logger.levels.DEBUG;
375
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazycatcloud/lzc-cli",
3
- "version": "1.2.21",
3
+ "version": "1.2.24",
4
4
  "description": "lazycat cloud developer kit",
5
5
  "files": [
6
6
  "template",
@@ -18,31 +18,31 @@
18
18
  "license": "ISC",
19
19
  "dependencies": {
20
20
  "@balena/dockerignore": "^1.0.2",
21
- "@grpc/grpc-js": "^1.8.18",
22
- "@grpc/proto-loader": "^0.7.8",
23
- "archiver": "^5.3.0",
24
- "chalk": "^4.1.2",
25
- "chokidar": "^3.5.3",
21
+ "@grpc/grpc-js": "^1.11.1",
22
+ "@grpc/proto-loader": "^0.7.13",
23
+ "archiver": "^7.0.1",
24
+ "chalk": "^5.3.0",
25
+ "chokidar": "^3.6.0",
26
26
  "command-exists": "^1.2.9",
27
- "dockerfile-ast": "^0.5.0",
28
- "envsub": "^4.0.7",
29
- "fast-glob": "^3.2.7",
27
+ "dockerfile-ast": "^0.6.1",
28
+ "envsub": "^4.1.0",
29
+ "fast-glob": "^3.3.2",
30
30
  "form-data": "^4.0.0",
31
- "ignore": "^5.2.0",
32
- "inquirer": "^8.2.0",
33
- "isbinaryfile": "^4.0.8",
31
+ "ignore": "^5.3.2",
32
+ "inquirer": "^10.1.8",
33
+ "isbinaryfile": "^5.0.2",
34
34
  "js-yaml": "^4.1.0",
35
35
  "lodash.debounce": "^4.0.8",
36
36
  "lodash.merge": "^4.6.2",
37
37
  "lodash.mergewith": "^4.6.2",
38
- "loglevel": "^1.8.0",
39
- "node-fetch": "^2.6.6",
40
- "tar": "^6.1.11",
41
- "yargs": "^17.5.1"
38
+ "loglevel": "^1.9.1",
39
+ "node-fetch": "^3.3.2",
40
+ "tar": "^7.4.3",
41
+ "yargs": "^17.7.2"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/command-exists": "^1.2.0",
45
- "prettier": "^2.5.0"
44
+ "@types/command-exists": "^1.2.3",
45
+ "prettier": "^3.3.3"
46
46
  },
47
47
  "publishConfig": {
48
48
  "registry": "https://registry.npmjs.org",
@@ -1,4 +1,4 @@
1
- FROM alpine:3.16
1
+ FROM alpine:latest
2
2
 
3
3
  RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
4
4
 
@@ -1,4 +1,4 @@
1
- FROM alpine
1
+ FROM alpine:latest
2
2
 
3
3
  RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
4
4
 
@@ -1,6 +1,6 @@
1
1
  lzc-sdk-version: 0.1
2
2
 
3
- package: ${package} # app的唯一标识符
3
+ package: ${package} # app的唯一标识符
4
4
  version: ${version} # app的版本
5
5
  name: ${name} # app名称
6
6
  description: ${description} # app描述
@@ -13,7 +13,7 @@ author: ${author} # app author
13
13
  application:
14
14
  subdomain: ${subdomain} #期望的app域名
15
15
  routes:
16
- - /=https://www.linakesi.com
16
+ - /=https://lazycat.cloud
17
17
  handlers:
18
18
  error_page_templates:
19
19
  502: /lzcapp/pkg/content/502.html.tpl
@@ -1,6 +1,6 @@
1
1
  lzc-sdk-version: 0.1
2
2
 
3
- package: ${package} # app的唯一标识符
3
+ package: ${package} # app的唯一标识符
4
4
  version: ${version} # app的版本
5
5
  name: ${name} # app名称
6
6
  description: ${description} # app描述
@@ -1,4 +1,4 @@
1
- # 整个文件中,可以通过 ${var} 的方式,使用 manifest.yml 文件中定义的值
1
+ # 整个文件中,可以通过 ${var} 的方式,使用 manifest 字段指定的文件定义的值
2
2
 
3
3
  # buildscript
4
4
  # - 可以为构建脚本的路径地址
@@ -30,7 +30,7 @@ icon: ./lazycat.png
30
30
  # devshell:
31
31
  # routes:
32
32
  # - /=http://127.0.0.1:3000
33
- # image: registry.lazycat.cloud/lzc-cli/devshell:0.0.4
33
+ # image: registry.lazycat.cloud/lzc-cli/devshell:v0.0.5
34
34
 
35
35
  # devshell 指定构建Dockerfile
36
36
  # image 字段如果没有定义,将默认使用 ${package}-devshell:${version}
@@ -42,7 +42,7 @@ icon: ./lazycat.png
42
42
  # build: .
43
43
 
44
44
  # dvshell 指定开发依赖的情况
45
- # 这种情况下,选用 apline:3.16 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
45
+ # 这种情况下,选用 alpine:latest 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
46
46
  # 如果 dependencies 和 build 同时存在,将会优先使用 dependencies
47
47
  devshell:
48
48
  routes:
@@ -1,4 +1,4 @@
1
- # 整个文件中,可以通过 ${var} 的方式,使用 manifest.yml 文件中定义的值
1
+ # 整个文件中,可以通过 ${var} 的方式,使用 manifest 字段指定的文件定义的值
2
2
 
3
3
  # buildscript
4
4
  # - 可以为构建脚本的路径地址
@@ -30,7 +30,7 @@ icon: ./lazycat.png
30
30
  # devshell:
31
31
  # routes:
32
32
  # - /=http://127.0.0.1:3000
33
- # image: registry.lazycat.cloud/lzc-cli/devshell:0.0.4
33
+ # image: registry.lazycat.cloud/lzc-cli/devshell:v0.0.5
34
34
 
35
35
  # devshell 指定构建Dockerfile
36
36
  # image 字段如果没有定义,将默认使用 ${package}-devshell:${version}
@@ -42,7 +42,7 @@ icon: ./lazycat.png
42
42
  # build: .
43
43
 
44
44
  # dvshell 指定开发依赖的情况
45
- # 这种情况下,选用 apline:3.16 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
45
+ # 这种情况下,选用 alpine:latest 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
46
46
  # 如果 dependencies 和 build 同时存在,将会优先使用 dependencies
47
47
  devshell:
48
48
  routes:
@@ -1,4 +1,4 @@
1
- # 整个文件中,可以通过 ${var} 的方式,使用 manifest.yml 文件中定义的值
1
+ # 整个文件中,可以通过 ${var} 的方式,使用 manifest 字段指定的文件定义的值
2
2
 
3
3
  # buildscript
4
4
  # - 可以为构建脚本的路径地址
@@ -30,7 +30,7 @@ icon: ./lazycat.png
30
30
  # devshell:
31
31
  # routes:
32
32
  # - /=http://127.0.0.1:3000
33
- # image: registry.lazycat.cloud/lzc-cli/devshell:0.0.4
33
+ # image: registry.lazycat.cloud/lzc-cli/devshell:v0.0.5
34
34
 
35
35
  # devshell 指定构建Dockerfile
36
36
  # image 字段如果没有定义,将默认使用 ${package}-devshell:${version}
@@ -42,7 +42,7 @@ icon: ./lazycat.png
42
42
  # build: .
43
43
 
44
44
  # dvshell 指定开发依赖的情况
45
- # 这种情况下,选用 apline:3.16 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
45
+ # 这种情况下,选用 alpine:latest 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
46
46
  # 如果 dependencies 和 build 同时存在,将会优先使用 dependencies
47
47
  devshell:
48
48
  routes:
@@ -1,4 +1,4 @@
1
- # 整个文件中,可以通过 ${var} 的方式,使用 manifest.yml 文件中定义的值
1
+ # 整个文件中,可以通过 ${var} 的方式,使用 manifest 字段指定的文件定义的值
2
2
 
3
3
  # buildscript
4
4
  # - 可以为构建脚本的路径地址
@@ -6,7 +6,7 @@
6
6
  # buildscript: ./build.sh
7
7
 
8
8
  # manifest: 指定 lpk 包的 manifest.yml 文件路径
9
- # manifest: ./lzc-manifest.yml
9
+ manifest: ./lzc-manifest.yml
10
10
 
11
11
  # contentdir: 指定打包的内容,将会打包到 lpk 中
12
12
  contentdir: ./error_pages
@@ -29,7 +29,7 @@ icon: ./lazycat.png
29
29
  # devshell:
30
30
  # routes:
31
31
  # - /=http://127.0.0.1:3000
32
- # image: registry.lazycat.cloud/lzc-cli/devshell:0.0.4
32
+ # image: registry.lazycat.cloud/lzc-cli/devshell:v0.0.5
33
33
 
34
34
  # devshell 指定构建Dockerfile
35
35
  # image 字段如果没有定义,将默认使用 ${package}-devshell:${version}
@@ -41,7 +41,7 @@ icon: ./lazycat.png
41
41
  # build: .
42
42
 
43
43
  # dvshell 指定开发依赖的情况
44
- # 这种情况下,选用 apline:3.16 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
44
+ # 这种情况下,选用 alpine:latest 作为基础镜像,在 dependencies 中添加所需要的开发依赖即可
45
45
  # 如果 dependencies 和 build 同时存在,将会优先使用 dependencies
46
46
  # devshell:
47
47
  # routes: