[feat] rainbox
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
---
|
||||
outline: deep
|
||||
order: 4
|
||||
---
|
||||
|
||||
# 开发
|
||||
|
||||
## 配置文件
|
||||
API Key 保存在 `C:\Users\[user]\.rain\config.json` 中,配置文件格式示例:
|
||||
```json
|
||||
{
|
||||
"api_key": "xxxxxxxxxx",
|
||||
"servers": [
|
||||
{ "id": "123456", "name": "my-server" },
|
||||
{ "id": "789012", "name": "production" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 开发环境依赖
|
||||
|
||||
```cmd
|
||||
pip install requests
|
||||
```
|
||||
|
||||
## 打包
|
||||
|
||||
```cmd
|
||||
nuitka --standalone --windows-console-mode=force --include-package=charset_normalizer --output-filename=rain.exe --windows-icon-from-ico=ico.ico 1.py
|
||||
```
|
||||
|
||||
## 安装包
|
||||
[Inno Setup](https://jrsoftware.org/isinfo.php)是一个非常好用的安装包制作软件。您可以参考一下步骤编辑iss脚本为安装包添加"添加到用户环境变量 PATH"选项:
|
||||
|
||||
1. 在`[Setup]`中,添加`gesEnvironment=yes`
|
||||
2. 在`[Tasks]`中,添加选项
|
||||
```
|
||||
Name: "addtopath"; Description: "添加到用户环境变量 PATH"; GroupDescription: "其他任务:"; Flags: unchecked
|
||||
```
|
||||
|
||||
3. 在任意位置添加以下脚本
|
||||
```
|
||||
[Registry]
|
||||
; 仅当用户勾选 addtopath 且路径不存在时才添加
|
||||
Root: HKCU; Subkey: "Environment"; ValueType: expandsz; ValueName: "Path"; \
|
||||
ValueData: "{olddata};{app}"; Check: NeedsAddPath(ExpandConstant('{app}')); \
|
||||
Tasks: addtopath
|
||||
|
||||
[Code]
|
||||
const
|
||||
EnvironmentKey = 'Environment';
|
||||
|
||||
// 检查路径是否已存在于 PATH 中
|
||||
function NeedsAddPath(Param: string): boolean;
|
||||
var
|
||||
OrigPath: string;
|
||||
begin
|
||||
if not RegQueryStringValue(HKEY_CURRENT_USER, EnvironmentKey, 'Path', OrigPath) then
|
||||
begin
|
||||
Result := True;
|
||||
exit;
|
||||
end;
|
||||
// 前后加分号判断,避免误匹配
|
||||
Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
|
||||
end;
|
||||
|
||||
// 从 PATH 中移除指定路径(卸载时调用,幂等操作)
|
||||
procedure RemovePath(Path: string);
|
||||
var
|
||||
Paths: string;
|
||||
P: Integer;
|
||||
begin
|
||||
if not RegQueryStringValue(HKEY_CURRENT_USER, EnvironmentKey, 'Path', Paths) then
|
||||
exit;
|
||||
// 确保路径前后有分号进行匹配
|
||||
P := Pos(';' + Path + ';', ';' + Paths + ';');
|
||||
if P = 0 then exit;
|
||||
if P > 1 then P := P - 1;
|
||||
Delete(Paths, P, Length(Path) + 1);
|
||||
// 清理首尾可能残留的分号
|
||||
while (Length(Paths) > 0) and (Paths[1] = ';') do Delete(Paths, 1, 1);
|
||||
while (Length(Paths) > 0) and (Paths[Length(Paths)] = ';') do Delete(Paths, Length(Paths), 1);
|
||||
// 如果 PATH 变为空字符串,则删除该值;否则写入新值
|
||||
if Paths = '' then
|
||||
RegDeleteValue(HKEY_CURRENT_USER, EnvironmentKey, 'Path')
|
||||
else
|
||||
RegWriteStringValue(HKEY_CURRENT_USER, EnvironmentKey, 'Path', Paths);
|
||||
end;
|
||||
|
||||
// 卸载时自动清理 PATH
|
||||
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
||||
begin
|
||||
if CurUninstallStep = usUninstall then
|
||||
RemovePath(ExpandConstant('{app}'));
|
||||
end;
|
||||
```
|
||||
Reference in New Issue
Block a user