📋 目录


1. 📖 背景介绍

1.1 ⚡ terminal-AdvancedNewFile工具简介

terminal-AdvancedNewFile(也称为advance-touch)是一个用Python编写的命令行工具,灵感来源于Vim的AdvancedNewFile插件。它提供了一个简洁的ad命令,用于快速创建文件和目录的嵌套结构。

核心功能

  • 快速创建嵌套目录: 一条命令创建多层目录结构
  • 自动创建父目录: 创建文件时自动创建所需的父目录
  • 批量操作: 支持一次创建多个文件或目录
  • 简洁语法: 使用简单的路径语法,无需复杂的mkdir和touch组合

典型使用场景

  • 📁 快速创建项目目录结构
  • 📝 创建配置文件及其父目录
  • 🗂️ 批量创建多个目录
  • 🚀 提高开发效率,减少重复命令

1.2 🎯 适配目标

将terminal-AdvancedNewFile工具(版本1.0.3)适配到鸿蒙PC(HarmonyOS PC)平台,实现:

  • 🐍 Python脚本的跨平台支持
  • 🏗️ 支持aarch64-linux-ohos架构
  • 📦 打包Python依赖(Click库)
  • 📦 生成HNP格式的安装包
  • 📦 生成tar.gz格式的发布包
  • 💻 提供可执行的ad命令

1.3 🔧 技术栈

  • 语言: 🐍 Python 3.x
  • 依赖库: Click (>=6.7) - 命令行参数解析
  • 目标平台: 🎯 aarch64-linux-ohos
  • 打包格式: 📦 HNP (HarmonyOS Native Package)
  • 构建系统: Bash脚本 + Python pip

1.4 💡 工具优势

相比传统的mkdirtouch命令组合,terminal-AdvancedNewFile提供了:

  1. 🚀 更快的操作: 一条命令完成多步操作
  2. 📝 更简洁的语法: 直观的路径表示法
  3. 🔄 自动处理: 自动创建所需的父目录
  4. 💡 灵感来源: 借鉴Vim插件的优秀设计理念

2. 🛠️ 环境准备

2.1 💻 系统要求

  • 开发环境: 💻 macOS / 🐧 Linux / 🪟 Windows (WSL)
  • Python: 🐍 Python 3.6+(构建时需要)
  • pip: 📦 Python包管理器(用于安装Click依赖)
  • 鸿蒙SDK: 📦 OHOS SDK (包含native工具链和hnpcli打包工具)

2.2 📥 SDK安装

  1. 📥 下载SDK
# 下载鸿蒙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 📁 项目结构

HarmonyOSPC/build/
├── build.sh              # 主构建脚本
├── code/
│   └── terminal-AdvancedNewFile4OH/  # terminal-AdvancedNewFile工具源码目录
│       ├── advance_touch.py  # 主程序源码(Python)
│       ├── setup.py          # Python安装配置
│       ├── Pipfile           # Python依赖配置
│       ├── build_ohos.sh     # 鸿蒙构建脚本
│       ├── hnp.json          # HNP包配置
│       └── README.md         # 项目说明文档
└── output/               # 构建输出目录

3. 📁 项目结构分析

3.1 🐍 Python项目特点

advance_touch.py 主要功能:

  • 使用Click库进行命令行参数解析
  • 支持多个路径参数(nargs=-1
  • 提供-cd/--change选项,创建目录后切换到新目录
  • 自动创建父目录结构
  • 处理文件创建逻辑

核心代码逻辑

@click.command()
@click.argument('paths', nargs=-1)
@click.option('-cd/--change', is_flag=True, default=False, 
              help='After creating the directories, change to the new deeper directory.')
def advance_touch(paths, cd):
    """ Make folders and files """
    for path in paths:
        # 创建父目录
        new_dirs = '/'.join(path.split('/')[0:-1])
        if not os.path.exists(new_dirs) and new_dirs != '':
            os.makedirs(new_dirs)
        # 创建文件
        if not path.endswith('/') and not os.path.isfile(path):
            open(path, 'w+').close()

3.2 🔧 构建系统分析

原始问题

  • build_ohos.sh脚本错误地引用了cargoexa(这是从其他项目复制过来的)
  • 需要适配Python项目的构建流程
  • 需要安装Python依赖(Click库)
  • 需要创建可执行的命令包装脚本

解决方案

  • 重写build_ohos.sh脚本,适配Python项目
  • 使用pip install --target安装依赖到指定目录
  • 创建bash包装脚本ad,设置PYTHONPATH并执行Python脚本
  • 遵循Python项目的标准目录结构

4. 🔍 问题诊断与解决

4.1 ⚠️ 初始构建错误

执行构建命令:

./build.sh --sdk /Users/baixm/ohos-sdk --module terminal-AdvancedNewFile4OH

遇到的错误

❌ 错误1: cargo命令不存在
cargo build --release --no-default-features
cargo: command not found

原因: build_ohos.sh脚本错误地使用了Rust的cargo命令,但这是一个Python项目

解决方案: ✅ 重写构建脚本,使用Python和pip进行构建

❌ 错误2: exa文件不存在
BIN=target/release/exa
test -f "$BIN"
test: target/release/exa: No such file or directory

原因: 脚本引用了不存在的exa可执行文件

解决方案: ✅ 移除错误的文件引用,使用正确的Python脚本路径

❌ 错误3: Python依赖缺失

症状: 运行时缺少Click库

原因: Python依赖未正确安装

解决方案: ✅ 使用pip install --target将依赖安装到指定目录


5. ✏️ 详细修改步骤

5.1 🔧 重写build_ohos.sh脚本

5.1.1 💡 构建脚本设计思路

由于terminal-AdvancedNewFile是Python项目,构建流程需要:

  1. 📦 安装Python依赖(Click库)到指定目录
  2. 📂 复制主程序脚本(advance_touch.py)
  3. 🔧 创建可执行的命令包装脚本
  4. 📦 打包所有文件到HNP目录结构
5.1.2 📝 完整build_ohos.sh
#!/bin/bash
# terminal-AdvancedNewFile OpenHarmony build script
# This is a Python project that provides the 'ad' command for quick file/directory creation

set -e

export ADVANCE_TOUCH_INSTALL_HNP_PATH=${HNP_PUBLIC_PATH}/terminal-AdvancedNewFile.org/terminal-AdvancedNewFile_1.0.3

sys_prefix=${PREFIX}
export PREFIX=${ADVANCE_TOUCH_INSTALL_HNP_PATH}
echo "Installation prefix: ${PREFIX}"

# Create installation directories
mkdir -p ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/bin
mkdir -p ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/lib/python3/site-packages

# Install Python dependencies (Click)
echo "Installing Python dependencies..."
python3 -m pip install --target ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/lib/python3/site-packages click --quiet || {
    echo "Warning: Failed to install click via pip, trying alternative method..."
    # Alternative: copy click if available in system
    if python3 -c "import click" 2>/dev/null; then
        echo "Click is available in system Python"
    else
        echo "Error: Click library is required but not available"
        exit 1
    fi
}

# Copy the main Python script
cp advance_touch.py ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/lib/python3/site-packages/

# Create the 'ad' command wrapper script
cat > ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/bin/ad << 'EOF'
#!/bin/bash
# Wrapper script for advance_touch command
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$(dirname "$SCRIPT_DIR")"
PYTHON_PATH="${INSTALL_DIR}/lib/python3/site-packages"

# Add the install directory to PYTHONPATH
export PYTHONPATH="${PYTHONPATH}:${PYTHON_PATH}"

# Execute the Python script
exec python3 -c "import sys; sys.path.insert(0, '${PYTHON_PATH}'); from advance_touch import advance_touch; advance_touch()" "$@"
EOF

# Make the wrapper script executable
chmod +x ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/bin/ad

# Verify installation
if [ -f "${ADVANCE_TOUCH_INSTALL_HNP_PATH}/bin/ad" ]; then
    echo "✅ terminal-AdvancedNewFile installed successfully"
else
    echo "❌ Error: ad command not found after installation"
    exit 1
fi

# Copy HNP configuration file
test -f hnp.json
cp hnp.json ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/

# Package HNP and tar.gz
pushd ${ADVANCE_TOUCH_INSTALL_HNP_PATH}/../
    echo "Packing HNP package..."
    ${HNP_TOOL} pack -i ${ADVANCE_TOUCH_INSTALL_HNP_PATH} -o ${ARCHIVE_PATH}/
    echo "Creating tar.gz archive..."
    tar -zvcf ${ARCHIVE_PATH}/ohos_terminal-AdvancedNewFile_1.0.3.tar.gz terminal-AdvancedNewFile_1.0.3/
popd

# Restore original PREFIX
export PREFIX=${sys_prefix}

echo "✅ Build completed successfully!"

关键点说明

  1. 📦 依赖安装: 使用pip install --target将Click库安装到指定目录,避免污染系统Python环境
  2. 📂 目录结构: 遵循Python标准目录结构(lib/python3/site-packages
  3. 🔧 包装脚本: 创建bash包装脚本ad,设置PYTHONPATH并执行Python脚本
  4. ✅ 错误处理: 添加依赖安装失败的回退机制
  5. 🔍 验证步骤: 安装后验证命令文件是否存在

5.2 📝 包装脚本设计

为什么需要包装脚本?

Python脚本不能直接作为可执行文件运行(需要设置PYTHONPATH),因此创建一个bash包装脚本:

#!/bin/bash
# Wrapper script for advance_touch command
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="$(dirname "$SCRIPT_DIR")"
PYTHON_PATH="${INSTALL_DIR}/lib/python3/site-packages"

# Add the install directory to PYTHONPATH
export PYTHONPATH="${PYTHONPATH}:${PYTHON_PATH}"

# Execute the Python script
exec python3 -c "import sys; sys.path.insert(0, '${PYTHON_PATH}'); from advance_touch import advance_touch; advance_touch()" "$@"

关键特性

  • 🔍 自动检测安装目录
  • 📚 设置PYTHONPATH环境变量
  • 🚀 使用exec执行Python脚本,保持命令行参数传递
  • 💡 支持所有原始功能(包括-cd选项)

6. ✅ 构建验证

6.1 🚀 执行构建

cd /Users/baixm/HarmonyOSPC/build
./build.sh --sdk /Users/baixm/ohos-sdk --module terminal-AdvancedNewFile4OH

6.2 📊 构建输出

✅ 成功输出示例:

Build in: <Darwin Mac 24.6.0 ...> by cross tool chains.
python  : Python 3.9.13
CC      : /Users/baixm/ohos-sdk/native/llvm/bin/clang
...
Installation prefix: /Users/baixm/HarmonyOSPC/data/service/hnp/terminal-AdvancedNewFile.org/terminal-AdvancedNewFile_1.0.3
Installing Python dependencies...
✅ terminal-AdvancedNewFile installed successfully
Packing HNP package...
[INFO][HNP][hnp_pack.c:116]PackHnp end. ... ret=0
Creating tar.gz archive...
a terminal-AdvancedNewFile_1.0.3
a terminal-AdvancedNewFile_1.0.3/bin
a terminal-AdvancedNewFile_1.0.3/bin/ad
a terminal-AdvancedNewFile_1.0.3/lib/python3/site-packages/advance_touch.py
...
✅ Build completed successfully!

6.3 📦 验证输出文件

ls -lh output/ | grep terminal-AdvancedNewFile

✅ 预期输出:

-rw-r--r--  1 user  staff   208K Nov 24 10:57 terminal-AdvancedNewFile.hnp
-rw-r--r--  1 user  staff   208K Nov 24 10:57 ohos_terminal-AdvancedNewFile_1.0.3.tar.gz

6.4 📁 验证安装目录结构

find /Users/baixm/HarmonyOSPC/data/service/hnp/terminal-AdvancedNewFile.org/terminal-AdvancedNewFile_1.0.3/ -type f | head -10

✅ 预期结构:

terminal-AdvancedNewFile_1.0.3/
├── bin/
│   └── ad                    # 可执行命令包装脚本
├── lib/
│   └── python3/
│       └── site-packages/
│           ├── advance_touch.py  # 主程序脚本
│           └── click/            # Click依赖库
│               ├── __init__.py
│               └── ...
└── hnp.json                    # HNP包配置

7. 💻 使用示例

7.1 🚀 基本使用

📁 创建单个目录
# 在鸿蒙PC终端执行
ad airport/plane/

# 结果:创建嵌套目录结构
# airport/
# └── plane/
📁 创建多个目录
# 在鸿蒙PC终端执行
ad airport/ station/ port/

# 结果:创建三个独立的目录
# airport/
# station/
# port/
📝 创建文件及其父目录
# 在鸿蒙PC终端执行
ad airport/plane/captain.txt

# 结果:自动创建父目录并创建文件
# airport/
# └── plane/
#     └── captain.txt
📁➕📝 混合创建目录和文件
# 在鸿蒙PC终端执行
ad airport/ train-station/train.txt

# 结果:
# airport/              # 目录
# train-station/        # 目录
#     └── train.txt     # 文件

7.2 🎯 高级用法

🔄 使用-cd选项切换目录
# 在鸿蒙PC终端执行
ad -cd project/src/components/

# 结果:
# 1. 创建目录结构:project/src/components/
# 2. 自动切换到新创建的目录
# 当前目录变为:./project/src/components/
📝 创建多个文件(使用shell扩展)
# 在鸿蒙PC终端执行(如果shell支持大括号扩展)
ad airport/plane/{captain,passenger}.txt

# 结果:
# airport/
# └── plane/
#     ├── captain.txt
#     └── passenger.txt
🗂️ 创建复杂的项目结构
# 在鸿蒙PC终端执行
ad myproject/src/main/ets/entryability/EntryAbility.ets
ad myproject/src/main/resources/base/element/string.json
ad myproject/src/main/resources/base/media/icon.png

# 结果:创建完整的项目目录结构
# myproject/
# └── src/
#     ├── main/
#     │   ├── ets/
#     │   │   └── entryability/
#     │   │       └── EntryAbility.ets
#     │   └── resources/
#     │       └── base/
#     │           ├── element/
#     │           │   └── string.json
#     │           └── media/
#     │               └── icon.png

7.3 💡 实际应用场景

📦 场景1: 快速创建配置文件
# 传统方式(需要多步)
mkdir -p ~/.config/myapp
touch ~/.config/myapp/config.json

# 使用ad命令(一步完成)
ad ~/.config/myapp/config.json
🚀 场景2: 创建项目骨架
# 在鸿蒙PC终端执行
ad myapp/src/main/ets/
ad myapp/src/main/resources/
ad myapp/README.md
ad myapp/.gitignore

# 快速创建项目基础结构
📝 场景3: 批量创建测试文件
# 在鸿蒙PC终端执行
ad tests/unit/test1.ets
ad tests/unit/test2.ets
ad tests/integration/test_api.ets

# 创建完整的测试目录结构

7.4 🔍 命令帮助

# 在鸿蒙PC终端执行
ad --help

# 输出:
# Usage: ad [OPTIONS] [PATHS]...
#
#   Make folders and files
#
# Options:
#   -cd / --change  After creating the directories, change to the new deeper directory.
#   --help          Show this message and exit.

8. 📚 总结与最佳实践

8.1 ✅ 适配要点总结

  1. 🐍 Python项目适配

    • ✅ 使用pip install --target安装依赖到指定目录
    • ✅ 创建bash包装脚本处理PYTHONPATH
    • ✅ 遵循Python标准目录结构
  2. 📦 依赖管理

    • ✅ 将依赖安装到项目目录,避免系统污染
    • ✅ 添加依赖安装失败的回退机制
    • ✅ 验证依赖是否正确安装
  3. 🔧 命令包装

    • ✅ 创建可执行的bash包装脚本
    • ✅ 自动设置PYTHONPATH环境变量
    • ✅ 保持命令行参数完整传递
  4. 📦 打包流程

    • ✅ 生成HNP格式安装包
    • ✅ 生成tar.gz格式发布包
    • ✅ 包含所有Python依赖

8.2 🔍 常见问题排查

⚠️ 问题1: Python依赖安装失败

症状: pip install失败或找不到Click库

排查步骤:

  1. 🔍 检查Python版本: python3 --version(需要3.6+)
  2. 🔍 检查pip是否可用: python3 -m pip --version
  3. 🌐 检查网络连接: ping pypi.org

✅ 解决方案:

  • 确保Python 3.6+已安装
  • 确保pip可用
  • 如果网络受限,考虑使用国内镜像源
⚠️ 问题2: ad命令无法执行

症状: ad: command not foundPermission denied

排查步骤:

  1. 🔍 检查文件是否存在: ls -l ${INSTALL_DIR}/bin/ad
  2. 🔍 检查文件权限: chmod +x ${INSTALL_DIR}/bin/ad
  3. 🔍 检查PATH环境变量: echo $PATH

✅ 解决方案:

  • 确保ad脚本有执行权限
  • bin目录添加到PATH环境变量
  • 或使用完整路径执行:/path/to/bin/ad
⚠️ 问题3: Python模块导入失败

症状: ModuleNotFoundError: No module named 'advance_touch'

原因: PYTHONPATH未正确设置

✅ 解决方案:

  • 检查包装脚本中的PYTHON_PATH设置
  • 确保advance_touch.py在正确的目录中
  • 验证PYTHONPATH环境变量

8.3 💡 最佳实践

  1. 🐍 Python项目适配

    • 使用虚拟环境或--target选项隔离依赖
    • 创建包装脚本处理环境变量
    • 遵循Python标准目录结构
  2. 📦 依赖管理

    • 明确列出所有依赖(在setup.py或requirements.txt中)
    • 使用固定版本号确保兼容性
    • 测试依赖安装流程
  3. 🔧 命令包装

    • 使用bash包装脚本处理Python环境
    • 自动检测安装路径
    • 保持命令行参数完整性
  4. 📁 目录结构

    • 遵循FHS(Filesystem Hierarchy Standard)标准
    • 可执行文件放在bin/目录
    • Python模块放在lib/python3/site-packages/目录
  5. ✅ 错误处理

    • 添加依赖安装失败的回退机制
    • 验证关键文件是否存在
    • 提供清晰的错误提示信息

8.4 🚀 未来改进方向

  1. 📦 依赖优化

    • 考虑使用静态打包工具(如PyInstaller)创建独立可执行文件
    • 减少运行时依赖,提高可移植性
  2. 🔧 功能增强

    • 添加更多命令行选项
    • 支持配置文件
    • 添加日志功能
  3. 📚 文档完善

    • 添加更多使用示例
    • 创建man手册页
    • 提供shell补全脚本

📎 附录

A. 📁 完整文件清单

✏️ 修改的文件:

  • 🔧 code/terminal-AdvancedNewFile4OH/build_ohos.sh - 鸿蒙构建脚本(重写)

📦 生成的文件:

  • 📦 output/terminal-AdvancedNewFile.hnp - HNP格式安装包
  • 📦 output/ohos_terminal-AdvancedNewFile_1.0.3.tar.gz - tar.gz格式发布包

B. 💻 参考命令

# 构建命令
./build.sh --sdk /path/to/ohos-sdk --module terminal-AdvancedNewFile4OH

# 查看构建输出
ls -lh output/ | grep terminal-AdvancedNewFile

# 验证安装目录
find ${HNP_PUBLIC_PATH}/terminal-AdvancedNewFile.org/terminal-AdvancedNewFile_1.0.3/ -type f

# 测试命令(在鸿蒙PC上)
export PATH=${HNP_PUBLIC_PATH}/terminal-AdvancedNewFile.org/terminal-AdvancedNewFile_1.0.3/bin:$PATH
ad test/demo.txt

C. 📌 版本信息

  • terminal-AdvancedNewFile版本: 1.0.3
  • 📅 适配日期: 2025-11-24
  • 🎯 目标平台: aarch64-linux-ohos
  • 🐍 Python版本: 3.6+
  • 📦 依赖库: Click >=6.7
  • 🔗 仓库地址: https://github.com/tanrax/terminal-AdvancedNewFile

D. 📚 相关资源

  • 🌐 GitHub仓库: https://github.com/tanrax/terminal-AdvancedNewFile
  • 📖 Click库文档: https://click.palletsprojects.com/
  • 💡 Vim AdvancedNewFile插件: https://github.com/topfunky/vim-advanced-new-file

E. 💡 技术说明

为什么需要包装脚本?

Python脚本不能直接作为可执行文件运行,因为:

  1. ⚙️ 需要设置PYTHONPATH环境变量
  2. 🐍 需要Python解释器
  3. 📚 需要导入Python模块

通过创建bash包装脚本,我们可以:

  • 🔍 自动检测安装路径
  • 📚 设置正确的PYTHONPATH
  • 🚀 无缝执行Python脚本
  • 💻 提供类似原生命令的用户体验

🎉 结语

本文档详细介绍了terminal-AdvancedNewFile命令行工具适配鸿蒙PC平台的完整流程。通过重写构建脚本、安装Python依赖和创建命令包装脚本,我们成功实现了ad命令在OpenHarmony PC平台上的部署。

希望本文档能够帮助开发者理解:

  • 🔧 如何适配Python项目到OpenHarmony平台
  • 📦 如何管理Python依赖和打包
  • 🔧 如何创建命令包装脚本
  • 💻 如何使用ad命令提高开发效率
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐