开源许可证生成利器:choosealicense-cli在鸿蒙PC上的完整适配实战

目录

  • [1. 背景介绍](#1. 背景介绍)
  • [2. 环境准备](#2. 环境准备)
  • [3. 项目结构分析](#3. 项目结构分析)
  • [4. 问题诊断与解决](#4. 问题诊断与解决)
  • [5. 详细修改步骤](#5. 详细修改步骤)
  • [6. 构建验证](#6. 构建验证)
  • [7. 使用示例](#7. 使用示例)
  • [8. 总结与最佳实践](#8. 总结与最佳实践)
  • 附录
    • [A. 完整文件清单](#A. 完整文件清单)
    • [B. 参考命令](#B. 参考命令)
    • [C. 版本信息](#C. 版本信息)
    • [D. 相关资源](#D. 相关资源)
    • [E. 技术说明](#E. 技术说明)

1. 背景介绍

1.1 choosealicense-cli 工具简介

choosealicense-cli 是一个用 Python 编写的命令行工具,它将 choosealicense.com 的功能带到终端,允许用户在命令行中列出、查看信息、生成各种开源许可证。它通过调用 GitHub API 获取许可证数据,为开发者提供了便捷的许可证管理能力。

核心功能

  • 列出所有许可证:显示所有可用的开源许可证列表
  • 查看许可证信息:显示指定许可证的详细信息(权限、条件、限制)
  • 查看许可证上下文:显示许可证模板的默认上下文变量
  • 生成许可证文件:根据模板生成完整的许可证文件
  • 自定义版权信息:支持自定义版权持有者姓名、年份、邮箱、项目名称
  • Git 集成:自动从 Git 配置读取用户信息(可选)

支持的许可证

支持 GitHub 上所有常见的开源许可证,包括:

  • MIT
  • Apache-2.0
  • GPL-2.0, GPL-3.0
  • LGPL-2.1, LGPL-3.0
  • BSD-2-Clause, BSD-3-Clause
  • ISC
  • MPL-2.0
  • AGPL-3.0
  • 等等

应用场景

  • 快速创建许可证:为新项目快速生成合适的开源许可证
  • 许可证对比:查看不同许可证的详细信息和区别
  • 开发工具集成:集成到项目初始化脚本中
  • 批量处理:自动化许可证生成流程

1.2 适配目标

将 choosealicense-cli 工具(版本 1.1.1)适配到鸿蒙PC(HarmonyOS PC)平台,实现:

  • Python 脚本的跨平台支持
  • 支持 aarch64-linux-ohos 架构
  • 打包 Python 依赖(click、requests 库)
  • 生成 HNP 格式的安装包
  • 生成 tar.gz 格式的发布包
  • 提供可执行的 license 命令

1.3 技术栈

  • 语言: Python 3.4+
  • 依赖库 :
    • click>=4.0,<8.0 - 命令行参数解析(限制版本避免兼容性问题)
    • requests>=2.6.0 - HTTP 请求库
  • 目标平台: aarch64-linux-ohos
  • 打包格式: HNP (HarmonyOS Native Package)
  • 构建系统: Bash 脚本 + Python pip

1.4 工具优势

相比手动创建许可证文件,choosealicense-cli 提供了:

  • 快速生成:一条命令即可生成标准格式的许可证文件
  • 标准格式:使用 GitHub 官方许可证模板,确保格式正确
  • 自动更新:通过 API 获取最新版本的许可证模板
  • 灵活定制:支持自定义版权信息
  • 信息查询:可以查看许可证的详细信息和对比

1.5 项目信息

项目信息 详情
项目名称 choosealicense-cli
版本 1.1.1(适配版本)<br>1.1.0(原始版本)
许可证 MIT License
源码仓库 https://github.com/lord63/choosealicense-cli
适配平台 鸿蒙PC (aarch64-linux-ohos)
项目类型 Python 项目
运行时依赖 Python 3.4+<br>click>=4.0<br>requests>=2.6.0
系统依赖 网络连接(GitHub API)<br>Git(可选,用于自动填充用户信息)

2. 环境准备

2.1 系统要求

  • 开发环境: macOS / Linux / Windows (WSL)
  • Python: Python 3.4 或更高版本
  • pip: Python 包管理器
  • 鸿蒙SDK: OHOS SDK (包含 native 工具链和 hnpcli)

2.2 SDK 安装

  1. 下载 SDK
bash 复制代码
# 下载鸿蒙SDK
cd ~
wget https://cidownload.openharmony.cn/version/Master_Version/ohos-sdk-full_ohos/20250819_020817/version-Master_Version-ohos-sdk-full_ohos-20250819_020817-ohos-sdk-full_ohos.tar.gz

# 解压SDK
tar -zvxf version-Master_Version-ohos-sdk-full_ohos-20250819_020817-ohos-sdk-full_ohos.tar.gz
  1. SDK 目录结构

    ohos-sdk/
    ├── native/
    │ ├── llvm/bin/ # 编译器工具链
    │ ├── sysroot/ # 系统根目录(头文件和库)
    │ └── build-tools/ # 构建工具
    └── toolchains/
    └── hnpcli # HNP打包工具

2.3 Python 环境

由于 choosealicense-cli 是 Python 项目,需要确保开发环境中有 Python 3.4+:

bash 复制代码
# 检查 Python 版本
python3 --version

# 检查 pip 版本
pip3 --version

# 如果未安装 pip,可以使用以下命令安装
python3 -m ensurepip --upgrade

2.4 项目结构

复制代码
HarmonyOSPC/build/
├── build.sh                      # 主构建脚本
├── code/
│   └── choosealicense-cli/       # choosealicense-cli 工具源码
│       ├── choosealicense/       # Python 包目录
│       │   ├── __init__.py
│       │   ├── cli.py            # 主 CLI 逻辑
│       │   ├── ui.py              # UI 显示
│       │   └── utils.py          # 工具函数
│       ├── setup.py              # Python 包配置
│       ├── build_ohos.sh         # 鸿蒙构建脚本
│       ├── hnp.json              # HNP 包配置
│       ├── CHANGELOG              # 变更日志
│       └── README.OPENSOURCE      # 开源说明文档
└── output/                       # 构建输出目录

3. 项目结构分析

3.1 架构分析

choosealicense-cli 是一个纯 Python 项目,使用 click 库构建命令行界面,使用 requests 库调用 GitHub API:

复制代码
choosealicense-cli 项目结构:
├── choosealicense/               # Python 包目录
│   ├── __init__.py               # 包初始化文件
│   ├── cli.py                    # CLI 主逻辑(使用 click)
│   ├── ui.py                     # UI 显示逻辑
│   └── utils.py                  # 工具函数(API 调用、Git 配置)
├── setup.py                      # Python 包配置(setuptools)
├── README.rst                    # 项目说明文档
├── LICENSE                       # 许可证文件
└── ChangeLog                     # 变更日志

3.2 依赖分析

核心运行时依赖

  1. click>=4.0

    • 类型: 纯 Python 库
    • 功能: 用于构建命令行界面 (CLI)
    • 适配性 : 极高。作为纯 Python 库,只要 Python 运行时环境可用,click 就能正常工作
  2. requests>=2.6.0

    • 类型: 纯 Python 库
    • 功能: 用于发送 HTTP 请求,与 GitHub API 交互
    • 适配性 : 极高。requests 库是纯 Python 实现,不依赖 C 扩展

系统依赖

  1. Python 3.4+

    • 适配性 : ✅ 已适配。鸿蒙PC 已适配 Python 3.13.5
  2. 网络连接

    • 适配性: 必需。该工具通过 GitHub API 获取许可证数据,需要设备具备网络连接能力
  3. Git(可选)

    • 适配性 : 可选。用于自动获取 Git 用户信息(git config --get user.nameuser.email
    • 影响 : 如果系统没有安装 git 命令,用户可以通过命令行参数手动提供这些信息

3.3 适配可行性评估

适配难度: ⭐⭐☆☆☆ (非常简单)

优势

  • 纯 Python 项目:choosealicense-cli 及其核心依赖都是纯 Python 库,不包含 C 扩展
  • Python 已适配:鸿蒙PC 已适配 Python 3.13.5,为 choosealicense-cli 提供了坚实的基础
  • 功能独立:核心功能是调用 API 和文本处理,不涉及复杂的系统交互
  • 易于打包 :可以通过 pip install --target 将所有 Python 依赖打包到 HNP 包的 lib 目录中

挑战

  • ⚠️ 网络连接:运行时需要访问 GitHub API,确保鸿蒙PC 有网络连接
  • ⚠️ Git 配置(可选):如果用户希望自动获取 Git 用户信息,则需要在鸿蒙PC 上安装并配置 Git

4. 问题诊断与解决

4.1 问题诊断

在适配过程中,我们遇到了以下主要问题:

  1. click 版本兼容性问题
  2. PYTHONPATH 优先级问题
  3. Python 依赖打包问题

4.2 解决方案

4.2.1 click 版本兼容性问题

问题 :在鸿蒙PC上运行 license show 命令时,出现以下错误:

复制代码
ImportError: cannot import name 'get_terminal_size' from 'click.termui'

原因分析

  • choosealicense-cli 的代码使用了 click.termui.get_terminal_size() 函数
  • click 8.x 版本移除了 get_terminal_size 函数(API 变更)
  • pip install 默认安装最新版本的 click(8.x),导致不兼容

解决方案

在构建脚本中明确限制 click 版本范围,确保安装兼容的版本:

bash 复制代码
# 清理旧的 click 安装,防止 pip 缓存导致版本不正确
rm -rf ${CHOOSEALICENSE_CLI_INSTALL_HNP_PATH}/lib/python3/site-packages/click*

# 限制 click 版本为 >=4.0,<8.0,确保兼容性
pip3 install --target=${CHOOSEALICENSE_CLI_INSTALL_HNP_PATH}/lib/python3/site-packages \
    --no-deps \
    --force-reinstall \
    "click>=4.0,<8.0" \
    requests>=2.6.0 \
    urllib3 \
    certifi \
    charset-normalizer \
    idna

关键点

  • click>=4.0,<8.0:确保安装 click 7.x 版本(如 7.1.2),该版本仍包含 get_terminal_size 函数
  • --force-reinstall:强制重新安装,避免使用 pip 缓存中的旧版本
  • rm -rf click*:清理旧的 click 安装,确保版本正确
4.2.2 PYTHONPATH 优先级问题

问题 :即使安装了 click 7.x,Python 仍然导入 base.hnp 中的 click 8.x,导致同样的 ImportError

原因分析

  • base.hnp 中可能已经包含了 click 8.x
  • Python 的 sys.path 中,base.hnp 的路径优先级高于我们的 HNP 包路径
  • 使用 export PYTHONPATH="${PYTHONPATH}:${PYTHON_PATH}" 只是追加路径,base.hnp 的路径仍在前面

解决方案

修改启动脚本,清空 PYTHONPATH 并主动移除 base.hnp 的路径:

bash 复制代码
#!/bin/sh
# 获取脚本所在目录
SCRIPT_DIR=$(dirname "$0")
INSTALL_DIR=$(dirname "$SCRIPT_DIR")
PYTHON_PATH="${INSTALL_DIR}/lib/python3/site-packages"

# 重要:清空 PYTHONPATH,只使用我们的路径,避免使用 base.hnp 中的 click 8.x
export PYTHONPATH="${PYTHON_PATH}"

# 执行 choosealicense-cli
exec "${PYTHON_CMD}" -c "
import sys
import os

# 我们的包路径(必须最优先)
our_path = '${PYTHON_PATH}'

# 移除 base.hnp 的 site-packages 路径(如果存在)
base_paths_to_remove = [
    '/data/app/base.org/base_1.0/lib/python3/site-packages',
    '/data/app/base.org/base_1.0/sysroot/lib/python3/site-packages',
]

# 清理 sys.path,移除 base.hnp 的路径
sys.path = [p for p in sys.path if p not in base_paths_to_remove]

# 确保我们的路径在最前面
if our_path not in sys.path:
    sys.path.insert(0, our_path)
else:
    # 如果已存在,先移除再插入到最前面
    sys.path.remove(our_path)
    sys.path.insert(0, our_path)

# 导入并运行
from choosealicense.cli import cli
cli()
" "$@"

关键点

  • export PYTHONPATH="${PYTHON_PATH}":清空 PYTHONPATH,只使用我们的路径(不再追加)
  • sys.path = [p for p in sys.path if p not in base_paths_to_remove]:主动移除 base.hnp 的路径
  • sys.path.insert(0, our_path):确保我们的路径在 sys.path 最前面,优先级最高
4.2.3 Python 依赖打包问题

问题:如何确保 Python 依赖正确打包到 HNP 包中。

解决方案

使用 pip install --target 将所有依赖安装到 HNP 包的 lib/python3/site-packages 目录:

bash 复制代码
# 安装 Python 依赖到目标目录
pip3 install --target=${CHOOSEALICENSE_CLI_INSTALL_HNP_PATH}/lib/python3/site-packages \
    --no-deps \
    --force-reinstall \
    "click>=4.0,<8.0" \
    requests>=2.6.0 \
    urllib3 \
    certifi \
    charset-normalizer \
    idna

关键点

  • --target:指定安装目录,将所有依赖安装到 HNP 包中
  • --no-deps:不安装依赖的依赖,避免安装不必要的包
  • 手动安装必要的依赖:urllib3certificharset-normalizeridnarequests 的依赖


5. 详细修改步骤

5.1 构建脚本设计

5.1.1 build_ohos.sh 脚本结构
bash 复制代码
#!/bin/bash
# choosealicense-cli OpenHarmony build script
# choosealicense-cli is a Python CLI tool for generating open source licenses

set -e
export CHOOSEALICENSE_CLI_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/choosealicense-cli.org/choosealicense-cli_1.1.1

# 1. 环境检查和准备
# 2. 创建安装目录
# 3. 安装 Python 依赖(限制 click 版本)
# 4. 复制 Python 包文件
# 5. 创建启动脚本(处理 PYTHONPATH 优先级)
# 6. 复制文档文件
# 7. 打包 HNP
5.1.2 关键配置

Python 依赖安装

bash 复制代码
# 清理旧的 click 安装,防止 pip 缓存导致版本不正确
rm -rf ${CHOOSEALICENSE_CLI_INSTALL_HNP_PATH}/lib/python3/site-packages/click*

# 注意:click 8.x 版本移除了 get_terminal_size,需要安装 7.x 版本
# choosealicense-cli 的 ui.py 使用了 click.termui.get_terminal_size
# 因此限制 click 版本为 >=4.0,<8.0 以确保兼容性
pip3 install --target=${CHOOSEALICENSE_CLI_INSTALL_HNP_PATH}/lib/python3/site-packages \
    --no-deps \
    --force-reinstall \
    "click>=4.0,<8.0" \
    requests>=2.6.0 \
    urllib3 \
    certifi \
    charset-normalizer \
    idna

启动脚本设计

bash 复制代码
# 重要:清空 PYTHONPATH,只使用我们的路径,避免使用 base.hnp 中的 click 8.x
export PYTHONPATH="${PYTHON_PATH}"

# 在 Python 代码中移除 base.hnp 的路径
exec "${PYTHON_CMD}" -c "
import sys
# 移除 base.hnp 的 site-packages 路径
base_paths_to_remove = [
    '/data/app/base.org/base_1.0/lib/python3/site-packages',
    '/data/app/base.org/base_1.0/sysroot/lib/python3/site-packages',
]
sys.path = [p for p in sys.path if p not in base_paths_to_remove]
# 确保我们的路径在最前面
sys.path.insert(0, '${PYTHON_PATH}')
from choosealicense.cli import cli
cli()
" "$@"

关键点

  • click>=4.0,<8.0:确保安装兼容的 click 版本
  • --force-reinstall:强制重新安装,避免缓存问题
  • export PYTHONPATH="${PYTHON_PATH}":清空 PYTHONPATH,只使用我们的路径
  • sys.path = [p for p in sys.path if p not in base_paths_to_remove]:移除 base.hnp 的路径

5.2 HNP 包配置

5.2.1 hnp.json 配置
json 复制代码
{
    "type": "hnp-config",
    "name": "choosealicense-cli",
    "version": "1.1.1",
    "install": {}
}

配置说明

  • name: 包名称(choosealicense-cli)
  • version: 版本号(1.1.1)
  • install: 安装配置(空对象,直接合并到 sysroot)

5.3 安装路径结构

复制代码
/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/
├── bin/
│   └── license                    # 启动脚本
├── lib/
│   └── python3/
│       └── site-packages/
│           ├── choosealicense/   # choosealicense-cli 包
│           ├── click/             # click 7.x(兼容版本)
│           ├── requests/          # requests 库
│           └── ...                # 其他依赖
├── share/
│   └── doc/
│       └── choosealicense-cli/
│           ├── README.rst         # 项目说明文档
│           └── LICENSE            # 许可证文件
└── hnp.json                       # HNP 包配置

5.4 构建脚本关键修改

build_ohos.sh 中的关键修改:

  1. 限制 click 版本 :使用 click>=4.0,<8.0 确保兼容性
  2. 清理旧的 click 安装 :使用 rm -rf click* 避免版本冲突
  3. 清空 PYTHONPATH:在启动脚本中清空 PYTHONPATH,只使用我们的路径
  4. 移除 base.hnp 路径:在 Python 代码中主动移除 base.hnp 的路径

6. 构建验证

6.1 执行构建

bash 复制代码
cd /Users/lijiajun/ohos-sdk/HarmonyOSPC/build
SPECIFIC_DIR=choosealicense-cli ./build.sh --sdk /Users/lijiajun/ohos-sdk

6.2 构建输出

✅ 成功输出示例:

复制代码
Build in: <Darwin ...> by cross tool chains.
python  : Python 3.14.2
pip version: pip 25.3
Installation prefix: /Users/lijiajun/ohos-sdk/HarmonyOSPC/build/hnp/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1
Installing Python dependencies...
Installing choosealicense-cli...
choosealicense-cli installed successfully
Packing HNP package...
[INFO][HNP][hnp_pack.c:116]PackHnp end. ... ret=0
Creating tar.gz archive...
Build completed successfully!

6.3 验证输出文件

bash 复制代码
ls -lh output/ | grep choosealicense-cli

✅ 预期输出:

复制代码
-rw-r--r--  1 user  staff   1.6M Dec  9 18:01 choosealicense-cli.hnp

6.4 验证安装结构

bash 复制代码
# 解压 HNP 包查看结构
unzip -l output/choosealicense-cli.hnp | head -20

✅ 预期结构:

复制代码
Archive:  choosealicense-cli.hnp
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2025-12-09 18:01   choosealicense-cli_1.1.1/
        0  2025-12-09 18:01   choosealicense-cli_1.1.1/bin/
     1234  2025-12-09 18:01   choosealicense-cli_1.1.1/bin/license
        0  2025-12-09 18:01   choosealicense-cli_1.1.1/lib/
        0  2025-12-09 18:01   choosealicense-cli_1.1.1/lib/python3/
        0  2025-12-09 18:01   choosealicense-cli_1.1.1/lib/python3/site-packages/
        0  2025-12-09 18:01   choosealicense-cli_1.1.1/lib/python3/site-packages/choosealicense/
     5678  2025-12-09 18:01   choosealicense-cli_1.1.1/lib/python3/site-packages/choosealicense/cli.py
     ...

6.5 鸿蒙PC终端验证

在鸿蒙PC设备上安装 HNP 包后,需要验证命令是否可用:

6.5.1 检查命令是否在 PATH 中
bash 复制代码
# 检查 license 命令路径
which license

预期输出(如果命令在 PATH 中):

复制代码
/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license

如果 which license 返回空,说明命令不在 PATH 中,需要:

bash 复制代码
# 1. 检查文件是否存在
ls -lh /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license

# 2. 如果文件存在,添加到 PATH
export PATH=$PATH:/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin

# 3. 再次检查
which license
6.5.2 验证命令可执行性
bash 复制代码
# 检查命令权限
ls -l $(which license)

# 预期输出:-rwxr-xr-x(可执行)

# 检查命令版本(如果支持)
license --version

# 或查看帮助信息
license --help
6.5.3 功能测试
bash 复制代码
# 列出所有许可证
license show

# 查看 MIT 许可证信息
license info mit

# 生成 MIT 许可证
license generate mit --fullname "Test" --year "2025"
6.5.4 常见问题排查

问题 1:which license 找不到命令

原因

  • HNP 包未正确安装
  • PATH 环境变量未配置

解决方案

bash 复制代码
# 1. 检查 HNP 包是否安装
ls -la /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license

# 2. 如果文件存在,添加到 PATH
export PATH=$PATH:/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin

# 3. 永久添加到 PATH(编辑 ~/.bashrc 或 ~/.zshrc)
echo 'export PATH=$PATH:/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin' >> ~/.bashrc
source ~/.bashrc

# 4. 如果文件不存在,重新安装 HNP 包
hnp install choosealicense-cli.hnp

问题 2:license: command not found

原因

  • 命令不在 PATH 中
  • 文件权限问题

解决方案

bash 复制代码
# 1. 使用完整路径执行
/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license show

# 2. 如果完整路径可以执行,说明是 PATH 问题,按问题 1 解决
# 3. 如果完整路径也无法执行,检查文件权限
chmod +x /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license

问题 3:ImportError: cannot import name 'get_terminal_size' from 'click.termui'

原因

  • click 8.x 版本移除了 get_terminal_size 函数
  • Python 导入了 base.hnp 中的 click 8.x,而不是我们的 click 7.x

解决方案

bash 复制代码
# 1. 检查 click 版本
python3 -c "import click; print(click.__version__)"

# 2. 检查 click 路径(确认是否使用了 base.hnp 的 click)
python3 -c "import click; print(click.__file__)"

# 3. 如果路径包含 'base.org',说明使用了 base.hnp 的 click
# 解决方案:重新安装 HNP 包,确保启动脚本正确设置 PYTHONPATH

# 4. 验证我们的 click 版本(应该是 7.x)
python3 -c "import sys; sys.path.insert(0, '/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/lib/python3/site-packages'); import click; print(click.__version__)"

问题 4:Error: Python 3 is not found

原因

  • 目标系统未安装 Python 3
  • Python 3 不在启动脚本的搜索路径中

解决方案

bash 复制代码
# 1. 检查 Python 3 是否安装
which python3
python3 --version

# 2. 如果 Python 3 已安装但启动脚本找不到,可以手动指定
# 编辑启动脚本,或使用环境变量
export PYTHON_CMD=$(which python3)

7. 使用示例

7.1 安装

方式一:使用 HNP 包安装
bash 复制代码
# 安装 HNP 包
hnp install choosealicense-cli.hnp

# 或使用 tar.gz 包
tar -xzf ohos_choosealicense-cli_1.1.1.tar.gz
cp -r choosealicense-cli_1.1.1/* /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/

# 添加到 PATH
export PATH=$PATH:/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin
方式二:手动安装
bash 复制代码
# 复制文件到安装目录
mkdir -p /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin
mkdir -p /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/lib/python3/site-packages
mkdir -p /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/share/doc/choosealicense-cli

cp bin/license /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/
cp -r lib/python3/site-packages/choosealicense /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/lib/python3/site-packages/
cp share/doc/choosealicense-cli/* /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/share/doc/choosealicense-cli/

chmod +x /data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license

# 添加到 PATH
export PATH=$PATH:/data/service/hnp/choosealicense-cli.org/choosealicense-cli_1.1.1/bin

7.2 基本使用

1. 列出所有可用的许可证
bash 复制代码
license show

输出示例:

复制代码
agpl-3.0, apache-2.0, artistic-2.0, bsd-2-clause, bsd-3-clause, cc0-1.0, epl-1.0, epl-2.0, gpl-2.0, gpl-3.0, isc, lgpl-2.1, lgpl-3.0, mit, mpl-2.0, unlicense
2. 查看许可证信息
bash 复制代码
license info mit

输出示例:

复制代码
MIT License

A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code.

Permissions          Conditions            Limitations
commercial-use       license-and-copyright notice
modification       
distribution       
private-use        
patent-use         
3. 查看许可证上下文变量
bash 复制代码
license context mit

输出示例:

复制代码
The template has following defaults:
	year: 2025
	fullname: Your Name
	email: your.email@example.com
	project: the copyright holder
You can overwrite them at your ease.
4. 生成 MIT 许可证(使用默认值)
bash 复制代码
license generate mit
5. 生成 MIT 许可证(自定义信息)
bash 复制代码
license generate mit --fullname "John Doe" --year "2025" --email "john@example.com" --project "My Project"

输出示例:

复制代码
MIT License

Copyright (c) 2025 John Doe

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
6. 生成许可证并保存到文件
bash 复制代码
license generate mit --fullname "John Doe" --year "2025" > LICENSE

7.3 快速测试示例

以下命令可以直接在终端运行,无需创建文件:

示例 1:列出所有许可证
bash 复制代码
license show
示例 2:查看 MIT 许可证信息
bash 复制代码
license info mit
示例 3:生成 MIT 许可证(使用 Git 配置的用户信息)
bash 复制代码
# 如果已配置 Git 用户信息
license generate mit

# 或手动指定信息
license generate mit --fullname "鸿蒙开发者" --year "2025" --email "developer@example.com" --project "鸿蒙PC项目"
示例 4:生成 Apache-2.0 许可证
bash 复制代码
license generate apache-2.0 --fullname "鸿蒙开发者" --year "2025"
示例 5:查看 GPL-3.0 许可证信息
bash 复制代码
license info gpl-3.0

7.4 实际应用场景

场景 1:为新项目快速生成许可证
bash 复制代码
# 创建项目目录
mkdir my-project
cd my-project

# 生成 MIT 许可证
license generate mit --fullname "Your Name" --year "2025" > LICENSE

# 查看生成的文件
cat LICENSE
场景 2:对比不同许可证
bash 复制代码
# 查看 MIT 许可证信息
license info mit

# 查看 Apache-2.0 许可证信息
license info apache-2.0

# 查看 GPL-3.0 许可证信息
license info gpl-3.0
场景 3:批量生成许可证文件
bash 复制代码
# 为多个项目生成许可证
for project in project1 project2 project3; do
    mkdir -p $project
    license generate mit --fullname "Your Name" --year "2025" --project "$project" > $project/LICENSE
done

8. 总结与最佳实践

8.1 适配总结

本次适配成功将 choosealicense-cli 工具移植到鸿蒙PC 平台,主要工作包括:

  1. 依赖分析:确认了 choosealicense-cli 及其依赖都是纯 Python 库,适配难度低
  2. 构建脚本 :创建了 build_ohos.sh 脚本,实现了依赖安装、文件复制、HNP 打包等功能
  3. 启动脚本:创建了智能的启动脚本,能够自动查找 Python 3 解释器并设置 PYTHONPATH
  4. HNP 打包:成功生成了 HNP 格式的安装包(1.6MB)
  5. 文档完善:创建了完整的 CHANGELOG 和 README.OPENSOURCE 文档

8.2 关键技术点

  1. Python 依赖版本管理

    • 使用 pip install --target 将依赖安装到指定目录
    • 明确限制 click 版本为 >=4.0,<8.0,避免版本不兼容
    • 使用 --force-reinstallrm -rf 确保版本正确
    • 手动安装必要的依赖(urllib3、certifi、charset-normalizer、idna)
  2. PYTHONPATH 优先级控制

    • 清空 PYTHONPATH,只使用我们的路径(避免 base.hnp 的 click 8.x 干扰)
    • 在 Python 代码中主动移除 base.hnp 的路径
    • 确保我们的路径在 sys.path 最前面,优先级最高
  3. 启动脚本设计

    • 动态查找 Python 3 解释器(支持多种路径)
    • 清空并设置 PYTHONPATH 环境变量
    • 使用 exec 执行 Python 脚本,保持命令行参数传递
  4. HNP 包结构

    • bin/ 目录:存放可执行脚本
    • lib/python3/site-packages/ 目录:存放 Python 包和依赖
    • share/doc/ 目录:存放文档文件

8.3 最佳实践

  1. Python 项目适配

    • ✅ 优先使用纯 Python 库,避免 C 扩展依赖
    • ✅ 明确限制依赖版本,避免版本不兼容问题
    • ✅ 使用 pip install --target 打包依赖
    • ✅ 创建智能的启动脚本,自动查找 Python 解释器
    • ✅ 处理 PYTHONPATH 优先级问题,确保使用正确的依赖版本
  2. HNP 包设计

    • ✅ 遵循标准的目录结构(bin、lib、share)
    • ✅ 将 Python 包和依赖放在 lib/python3/site-packages/ 目录
    • ✅ 提供完整的文档和许可证文件
    • ✅ 确保依赖版本正确,避免与系统包冲突
  3. 依赖版本管理

    • ✅ 明确指定依赖版本范围,避免不兼容的版本
    • ✅ 使用 --force-reinstall 确保版本正确
    • ✅ 清理旧的依赖安装,避免版本冲突
    • ✅ 在启动脚本中控制 PYTHONPATH,确保使用正确的依赖
  4. 用户体验

    • ✅ 提供清晰的错误提示(如 Python 未找到)
    • ✅ 支持多种安装方式(HNP 包、tar.gz 包、手动安装)
    • ✅ 提供详细的使用示例和文档

8.4 注意事项

  1. 依赖版本兼容性

    • ⚠️ click 8.x 版本移除了 get_terminal_size 函数,必须使用 7.x 版本
    • ⚠️ 确保构建脚本中明确限制 click 版本为 >=4.0,<8.0
    • ⚠️ 如果遇到 ImportError: cannot import name 'get_terminal_size',检查 click 版本
  2. PYTHONPATH 优先级

    • ⚠️ base.hnp 中可能包含不兼容的依赖版本(如 click 8.x)
    • ⚠️ 启动脚本必须清空 PYTHONPATH,只使用我们的路径
    • ⚠️ 在 Python 代码中主动移除 base.hnp 的路径,确保使用正确的依赖
  3. 网络连接

    • ⚠️ choosealicense-cli 需要网络连接访问 GitHub API
    • ⚠️ 确保鸿蒙PC 设备有网络连接能力
  4. Python 版本

    • ⚠️ 需要 Python 3.4 或更高版本
    • ⚠️ 建议使用 Python 3.13.5(鸿蒙PC 已适配)
  5. Git 配置(可选)

    • ⚠️ Git 配置是可选的,用于自动填充用户信息
    • ⚠️ 如果没有 Git,可以通过命令行参数手动提供信息

8.5 未来改进方向

  1. 离线模式:支持离线使用,将许可证模板缓存到本地
  2. 更多许可证源:支持从其他源获取许可证模板
  3. 批量操作:支持批量生成多个许可证文件
  4. 模板自定义:支持自定义许可证模板

附录

A. 完整文件清单

创建的文件:

  • build_ohos.sh - OpenHarmony构建脚本
  • hnp.json - HNP包配置文件
  • CHANGELOG - 变更日志(添加鸿蒙PC适配信息)
  • README.OPENSOURCE - 开源说明文档

修改的文件:

  • build_ohos.sh - 配置Python依赖安装、限制click版本、创建启动脚本、处理PYTHONPATH优先级

生成的文件:

  • output/choosealicense-cli.hnp - HNP格式安装包
  • output/ohos_choosealicense-cli_1.1.1.tar.gz - tar.gz格式发布包

B. 参考命令

bash 复制代码
# 构建命令
cd /Users/lijiajun/ohos-sdk/HarmonyOSPC/build
SPECIFIC_DIR=choosealicense-cli ./build.sh --sdk /Users/lijiajun/ohos-sdk

# 查看构建输出
ls -lh output/ | grep choosealicense-cli

# 验证安装目录
tree ${HNP_PUBLIC_PATH}/choosealicense-cli.org/choosealicense-cli_1.1.1/

# 验证启动脚本(在macOS上)
cat ${HNP_PUBLIC_PATH}/choosealicense-cli.org/choosealicense-cli_1.1.1/bin/license | head -30

# 验证Python依赖(在macOS上)
ls -la ${HNP_PUBLIC_PATH}/choosealicense-cli.org/choosealicense-cli_1.1.1/lib/python3/site-packages/ | grep click

# 测试命令(在鸿蒙PC上)
export PATH=${HNP_PUBLIC_PATH}/choosealicense-cli.org/choosealicense-cli_1.1.1/bin:$PATH
license show
license info mit
license generate mit --fullname "鸿蒙开发者" --year "2025"

# 如果出现"ImportError: cannot import name 'get_terminal_size'"错误,检查:
# 1. click版本是否正确(应为7.x,不是8.x)
# 2. PYTHONPATH是否被正确设置(应该只包含我们的路径)
# 3. base.hnp的路径是否被移除
python3 -c "import sys; sys.path.insert(0, '${HNP_PUBLIC_PATH}/choosealicense-cli.org/choosealicense-cli_1.1.1/lib/python3/site-packages'); import click; print(click.__version__)"

C. 版本信息

  • choosealicense-cli版本 : 1.1.1(适配版本)
    1.1.0(原始版本)
  • 适配日期: 2025-12-09
  • 目标平台: aarch64-linux-ohos
  • 构建系统: Bash 脚本 + Python pip
  • 依赖数量: Python 3.4+、click>=4.0,<8.0、requests>=2.6.0
  • 源仓库地址: https://github.com/lord63/choosealicense-cli
  • 适配完成仓库地址: (待补充)

D. 相关资源

E. 技术说明

Python项目适配简介

choosealicense-cli是一个纯Python项目,适配工作主要包括:

  1. 依赖管理 : 使用pip install --target将依赖安装到HNP包中
  2. 版本控制: 明确限制依赖版本(如click>=4.0,<8.0),避免兼容性问题
  3. 路径优先级: 在启动脚本中控制PYTHONPATH,确保使用正确的依赖版本
  4. 启动脚本: 创建智能的启动脚本,自动查找Python解释器并设置环境变量

choosealicense-cli的优势

  • ✅ 纯Python实现:无需编译,适配简单
  • ✅ 功能完整:支持列出、查看、生成各种开源许可证
  • ✅ 标准格式:使用GitHub官方许可证模板
  • ✅ 灵活定制:支持自定义版权信息

关键技术点

  • 依赖版本管理: 明确限制click版本为>=4.0,<8.0,避免API变更导致的兼容性问题
  • PYTHONPATH控制: 清空PYTHONPATH,只使用我们的路径,避免base.hnp中的不兼容依赖干扰
  • 路径清理: 在Python代码中主动移除base.hnp的路径,确保我们的依赖优先级最高

结语

本文档详细介绍了choosealicense-cli开源许可证生成工具在鸿蒙PC平台上的适配过程。通过限制click版本、处理PYTHONPATH优先级、创建智能启动脚本等问题,成功实现了choosealicense-cli在鸿蒙PC平台上的部署。

choosealicense-cli工具为终端应用开发提供了便捷的许可证管理能力,是开发开源项目的重要辅助工具。希望本文档能够帮助开发者:

  • 📊 理解Python项目适配OpenHarmony的方法
  • 🔧 掌握依赖版本管理和PYTHONPATH控制技巧
  • 📦 了解HNP包的构建和打包流程
  • 💻 学习命令行工具的开发实践

💬 如有问题或建议,欢迎反馈!


相关推荐
hh.h.7 小时前
零基础入门:Flutter + 开源鸿蒙打造可视化儿童编程工具
flutter·开源·harmonyos
shenweihong7 小时前
鸿蒙6开发保存Excel文件
华为·excel·harmonyos
hh.h.7 小时前
无网络也能用!Flutter+开源鸿蒙构建轻量级应急通信系统
网络·flutter·开源
后端小张7 小时前
【JAVA进阶】鸿蒙开发与SpringBoot深度融合:从接口设计到服务部署全解析
java·spring boot·spring·spring cloud·华为·harmonyos·鸿蒙
NocoBase7 小时前
如何快速搭建一个替换 Excel 的系统?(完整指南)
数据库·低代码·开源·excel·个人开发·零代码·无代码
C雨后彩虹7 小时前
虚拟理财游戏
java·数据结构·算法·华为·面试
Zzz 小生7 小时前
Github-Lobe Chat:下一代开源AI聊天框架,重新定义人机交互体验
人工智能·开源·github·人机交互
威哥爱编程14 小时前
【鸿蒙开发案例篇】鸿蒙6.0的pdfService与pdfViewManager终极爆破
harmonyos·arkts·arkui
IvorySQL1 天前
PostgreSQL 中的“脏页(Dirty Pages)”是什么?
数据库·postgresql·开源