-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcli.py
More file actions
138 lines (125 loc) · 4.21 KB
/
cli.py
File metadata and controls
138 lines (125 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
"""CLI 入口:将 Simprint 浏览器构建产物打包为 ZIP。"""
import argparse
from importlib.metadata import PackageNotFoundError, version
from pathlib import Path
from config import (
DEFAULT_BUILD_DIR,
DEFAULT_CHROMIUM_ROOT,
DEFAULT_EXECUTABLE_NAME,
DEFAULT_FLATTEN_ZIP,
DEFAULT_OUTPUT_PREFIX,
DEFAULT_PACKAGE_DIR,
DEFAULT_RELEASE_FILE,
DEFAULT_SECTIONS,
resolve_chromium_root,
resolve_path_from_root,
)
from pack import create_zip, get_version
PACKAGE_NAME = "simprint-browser-packager"
def main() -> None:
parser = argparse.ArgumentParser(
description="将 Simprint 浏览器构建产物打包为 ZIP(基于 chrome.release 文件列表)"
)
parser.add_argument(
"--version",
action="version",
version=f"%(prog)s {get_cli_version()}",
)
parser.add_argument(
"--chromium-root",
type=Path,
default=Path(DEFAULT_CHROMIUM_ROOT),
metavar="PATH",
help="Chromium / Simprint 源码根目录,默认 ../simprint-browser/src",
)
parser.add_argument(
"--release-file",
type=Path,
default=Path(DEFAULT_RELEASE_FILE),
help="release 文件路径;相对路径按 chromium-root 解析",
)
parser.add_argument(
"--build-dir",
type=Path,
default=Path(DEFAULT_BUILD_DIR),
help="构建目录;相对路径按 chromium-root 解析",
)
parser.add_argument(
"--output",
"-o",
type=Path,
default=None,
help="输出 ZIP 完整路径(覆盖时不再自动加版本后缀)",
)
parser.add_argument(
"--executable-name",
default=DEFAULT_EXECUTABLE_NAME,
help="可执行文件名,如 simprint",
)
parser.add_argument(
"--sections",
default=DEFAULT_SECTIONS,
help="release 段落,逗号分隔,如 GENERAL,HIDPI,FFMPEG",
)
parser.add_argument(
"--package-dir",
default=DEFAULT_PACKAGE_DIR,
help="ZIP 顶层目录名;仅在禁用扁平化时影响最终输出结构",
)
parser.add_argument(
"--output-prefix",
default=DEFAULT_OUTPUT_PREFIX,
help="默认输出文件名前缀,最终文件名为 {prefix}-{version}.zip",
)
parser.add_argument(
"--flatten-zip",
action=argparse.BooleanOptionalAction,
default=DEFAULT_FLATTEN_ZIP,
help="是否扁平化 ZIP 根目录;默认开启,可用 --no-flatten-zip 关闭",
)
parser.add_argument(
"--verbose",
"-v",
action="store_true",
help="打印每个打包进 ZIP 的文件",
)
args = parser.parse_args()
chromium_root = resolve_chromium_root(args.chromium_root)
if not chromium_root.is_dir():
parser.error(f"SIMPRINT_CHROMIUM_ROOT 目录不存在: {chromium_root}")
build_dir = resolve_path_from_root(chromium_root, args.build_dir)
if not build_dir.is_dir():
parser.error(f"构建目录不存在: {build_dir}")
release_file = resolve_path_from_root(chromium_root, args.release_file)
if not release_file.is_file():
parser.error(f"release 文件不存在: {release_file}")
executable_name = args.executable_name
package_dir_name = args.package_dir.strip()
if not package_dir_name:
parser.error("PACKAGE_DIR 不能为空。")
sections = [s.strip() for s in args.sections.split(",") if s.strip()]
version = get_version(chromium_root)
if args.output is not None:
output = args.output
else:
prefix = args.output_prefix.strip()
# 最终文件名:{前缀}-{版本}.zip
output = Path(prefix).parent / f"{Path(prefix).name}-{version}.zip"
if not output.is_absolute():
output = Path.cwd() / output
create_zip(
build_dir=build_dir,
release_file=release_file,
chromium_root=chromium_root,
executable_name=executable_name,
sections=sections,
output_path=output,
package_dir_name=package_dir_name,
flatten_top_dir=args.flatten_zip,
verbose=args.verbose,
)
def get_cli_version() -> str:
try:
return version(PACKAGE_NAME)
except PackageNotFoundError:
return "0.1.0"