以递归的方式快速创建文件和目录开源项目AdvancedNewFile命令行工具适配开源鸿蒙PC实战指南
本文介绍了terminal-AdvancedNewFile工具(advance-touch)向鸿蒙PC平台的适配过程。该Python工具提供简洁的ad命令,用于快速创建文件和嵌套目录结构。适配工作包括:重写构建脚本以支持Python项目、安装Click依赖、创建命令包装脚本,并打包为HNP格式。文章详细分析了项目结构、构建问题诊断及解决方案,最终实现了在aarch64-linux-ohos平台的兼
📋 目录
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 💡 工具优势
相比传统的mkdir和touch命令组合,terminal-AdvancedNewFile提供了:
- 🚀 更快的操作: 一条命令完成多步操作
- 📝 更简洁的语法: 直观的路径表示法
- 🔄 自动处理: 自动创建所需的父目录
- 💡 灵感来源: 借鉴Vim插件的优秀设计理念
2. 🛠️ 环境准备
2.1 💻 系统要求
- 开发环境: 💻 macOS / 🐧 Linux / 🪟 Windows (WSL)
- Python: 🐍 Python 3.6+(构建时需要)
- pip: 📦 Python包管理器(用于安装Click依赖)
- 鸿蒙SDK: 📦 OHOS SDK (包含native工具链和hnpcli打包工具)
2.2 📥 SDK安装
- 📥 下载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
- 📁 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脚本错误地引用了cargo和exa(这是从其他项目复制过来的)- 需要适配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项目,构建流程需要:
- 📦 安装Python依赖(Click库)到指定目录
- 📂 复制主程序脚本(advance_touch.py)
- 🔧 创建可执行的命令包装脚本
- 📦 打包所有文件到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!"
关键点说明:
- 📦 依赖安装: 使用
pip install --target将Click库安装到指定目录,避免污染系统Python环境 - 📂 目录结构: 遵循Python标准目录结构(
lib/python3/site-packages) - 🔧 包装脚本: 创建bash包装脚本
ad,设置PYTHONPATH并执行Python脚本 - ✅ 错误处理: 添加依赖安装失败的回退机制
- 🔍 验证步骤: 安装后验证命令文件是否存在
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 ✅ 适配要点总结
-
🐍 Python项目适配
- ✅ 使用
pip install --target安装依赖到指定目录 - ✅ 创建bash包装脚本处理PYTHONPATH
- ✅ 遵循Python标准目录结构
- ✅ 使用
-
📦 依赖管理
- ✅ 将依赖安装到项目目录,避免系统污染
- ✅ 添加依赖安装失败的回退机制
- ✅ 验证依赖是否正确安装
-
🔧 命令包装
- ✅ 创建可执行的bash包装脚本
- ✅ 自动设置PYTHONPATH环境变量
- ✅ 保持命令行参数完整传递
-
📦 打包流程
- ✅ 生成HNP格式安装包
- ✅ 生成tar.gz格式发布包
- ✅ 包含所有Python依赖
8.2 🔍 常见问题排查
⚠️ 问题1: Python依赖安装失败
症状: pip install失败或找不到Click库
排查步骤:
- 🔍 检查Python版本:
python3 --version(需要3.6+) - 🔍 检查pip是否可用:
python3 -m pip --version - 🌐 检查网络连接:
ping pypi.org
✅ 解决方案:
- 确保Python 3.6+已安装
- 确保pip可用
- 如果网络受限,考虑使用国内镜像源
⚠️ 问题2: ad命令无法执行
症状: ad: command not found或Permission denied
排查步骤:
- 🔍 检查文件是否存在:
ls -l ${INSTALL_DIR}/bin/ad - 🔍 检查文件权限:
chmod +x ${INSTALL_DIR}/bin/ad - 🔍 检查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 💡 最佳实践
-
🐍 Python项目适配
- 使用虚拟环境或
--target选项隔离依赖 - 创建包装脚本处理环境变量
- 遵循Python标准目录结构
- 使用虚拟环境或
-
📦 依赖管理
- 明确列出所有依赖(在setup.py或requirements.txt中)
- 使用固定版本号确保兼容性
- 测试依赖安装流程
-
🔧 命令包装
- 使用bash包装脚本处理Python环境
- 自动检测安装路径
- 保持命令行参数完整性
-
📁 目录结构
- 遵循FHS(Filesystem Hierarchy Standard)标准
- 可执行文件放在
bin/目录 - Python模块放在
lib/python3/site-packages/目录
-
✅ 错误处理
- 添加依赖安装失败的回退机制
- 验证关键文件是否存在
- 提供清晰的错误提示信息
8.4 🚀 未来改进方向
-
📦 依赖优化
- 考虑使用静态打包工具(如PyInstaller)创建独立可执行文件
- 减少运行时依赖,提高可移植性
-
🔧 功能增强
- 添加更多命令行选项
- 支持配置文件
- 添加日志功能
-
📚 文档完善
- 添加更多使用示例
- 创建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脚本不能直接作为可执行文件运行,因为:
- ⚙️ 需要设置PYTHONPATH环境变量
- 🐍 需要Python解释器
- 📚 需要导入Python模块
通过创建bash包装脚本,我们可以:
- 🔍 自动检测安装路径
- 📚 设置正确的PYTHONPATH
- 🚀 无缝执行Python脚本
- 💻 提供类似原生命令的用户体验
🎉 结语
本文档详细介绍了terminal-AdvancedNewFile命令行工具适配鸿蒙PC平台的完整流程。通过重写构建脚本、安装Python依赖和创建命令包装脚本,我们成功实现了ad命令在OpenHarmony PC平台上的部署。
希望本文档能够帮助开发者理解:
- 🔧 如何适配Python项目到OpenHarmony平台
- 📦 如何管理Python依赖和打包
- 🔧 如何创建命令包装脚本
- 💻 如何使用
ad命令提高开发效率
更多推荐




所有评论(0)