# InnoShop 开发者工具包 (DevTools) InnoShop 开发者工具包是一个强大的命令行工具集,用于快速开发、验证和发布 InnoShop 插件和主题。它提供了完整的脚手架生成、规范验证和市场发布功能。 ## 📋 目录 - [功能特性](#功能特性) - [安装](#安装) - [快速开始](#快速开始) - [命令详解](#命令详解) - [使用示例](#使用示例) - [最佳实践](#最佳实践) - [常见问题](#常见问题) ## ✨ 功能特性 ### 代码生成 - **插件脚手架生成**:一键生成完整的插件目录结构和基础文件 - **主题脚手架生成**:快速创建主题基础结构 - **组件生成**:支持生成控制器、模型、服务、仓储、迁移文件等 ### 规范验证 - **插件验证**:检查插件是否符合 InnoShop 开发规范 - **主题验证**:验证主题配置和结构 - **详细报告**:提供清晰的错误和警告信息 ### 市场发布 - **自动打包**:基于 `config.json` 自动创建发布包 - **规范检查**:发布前自动验证插件/主题规范 - **一键上传**:直接发布到 InnoShop 官方市场 ## 🚀 安装 DevTools 已集成到 InnoShop 系统中,无需额外安装。如果作为独立 Composer 包使用: ```bash composer require innoshop/devtools ``` ## 📖 快速开始 ### 创建你的第一个插件 ```bash # 生成基础插件 php artisan dev:make-plugin MyFirstPlugin --type=feature # 生成包含控制器和模型的插件 php artisan dev:make-plugin PaymentGateway --type=billing --with-controller --with-model --with-migration ``` ### 创建主题 ```bash php artisan dev:make-theme modern_shop ``` ### 验证插件 ```bash php artisan dev:validate-plugin plugins/MyFirstPlugin ``` ### 发布到市场 ```bash php artisan dev:publish-plugin plugins/MyFirstPlugin ``` ## 📚 命令详解 ### 代码生成命令 #### `dev:make-plugin` / `devtools:make-plugin` 生成完整的插件脚手架。 **参数:** - `name` (必需): 插件名称,使用 PascalCase(如:`StripePayment`) **选项:** - `--type`: 插件类型,可选值: - `feature` - 功能模块(默认) - `marketing` - 营销工具 - `billing` - 支付方式 - `shipping` - 物流方式 - `fee` - 订单费用 - `social` - 社交登录 - `language` - 语言包 - `translator` - 翻译工具 - `intelli` - AI模型 - `--with-controller`: 生成控制器文件 - `--with-model`: 生成模型文件 - `--with-migration`: 生成数据库迁移文件(需要配合 `--with-model`) - `--name-zh`: 中文名称 - `--name-en`: 英文名称 - `--description-zh`: 中文描述 - `--description-en`: 英文描述 **示例:** ```bash # 基础插件 php artisan dev:make-plugin MyPlugin # 完整插件(包含控制器、模型和迁移) php artisan dev:make-plugin PaymentPlugin \ --type=billing \ --with-controller \ --with-model \ --with-migration \ --name-zh="支付插件" \ --name-en="Payment Plugin" \ --description-zh="支持多种支付方式" \ --description-en="Support multiple payment methods" # 使用完整命令名 php artisan devtools:make-plugin MyPlugin ``` **生成的文件结构:** ``` MyPlugin/ ├── Boot.php # 插件启动类 ├── config.json # 插件配置 ├── fields.php # 配置字段定义 ├── Controllers/ # 控制器目录 ├── Models/ # 模型目录 ├── Services/ # 服务类目录 ├── Repositories/ # 仓储类目录 ├── Routes/ # 路由文件 │ ├── panel.php │ └── front.php ├── Views/ # 视图文件 ├── Lang/ # 语言包 │ ├── en/ │ │ ├── common.php │ │ ├── panel.php │ │ └── front.php │ └── zh-cn/ │ ├── common.php │ ├── panel.php │ └── front.php └── Database/ └── Migrations/ # 数据库迁移 ``` #### `dev:make-theme` / `devtools:make-theme` 生成主题脚手架。 **参数:** - `name` (必需): 主题名称,使用 snake_case(如:`modern_shop`) **选项:** - `--name-zh`: 中文名称 - `--name-en`: 英文名称 - `--description-zh`: 中文描述 - `--description-en`: 英文描述 **示例:** ```bash php artisan dev:make-theme modern_shop \ --name-zh="现代商店" \ --name-en="Modern Shop" \ --description-zh="现代化的电商主题" \ --description-en="Modern e-commerce theme" ``` **生成的文件结构:** ``` modern_shop/ ├── config.json # 主题配置 ├── views/ # 视图文件 │ └── layout.blade.php └── public/ # 公共资源 ├── css/ ├── js/ └── images/ ``` #### `dev:make-controller` / `devtools:make-controller` 为现有插件生成控制器。 **参数:** - `name` (必需): 控制器名称,格式:`PluginName/ControllerName` **选项:** - `--plugin`: 插件路径(如果不在 `plugins` 目录下) **示例:** ```bash php artisan dev:make-controller MyPlugin/ProductController php artisan dev:make-controller MyPlugin/Admin/UserController --plugin=/path/to/plugin ``` #### `dev:make-model` / `devtools:make-model` 为现有插件生成模型。 **参数:** - `name` (必需): 模型名称,格式:`PluginName/ModelName` **选项:** - `--plugin`: 插件路径 **示例:** ```bash php artisan dev:make-model MyPlugin/Product ``` #### `dev:make-service` / `devtools:make-service` 为现有插件生成服务类。 **参数:** - `name` (必需): 服务名称,格式:`PluginName/ServiceName` **示例:** ```bash php artisan dev:make-service MyPlugin/PaymentService ``` #### `dev:make-repository` / `devtools:make-repository` 为现有插件生成仓储类。 **参数:** - `name` (必需): 仓储名称,格式:`PluginName/RepositoryName` **选项:** - `--model` (必需): 关联的模型名称 **示例:** ```bash php artisan dev:make-repository MyPlugin/ProductRepo --model=Product ``` #### `dev:make-migration` / `devtools:make-migration` 为现有插件生成数据库迁移文件。 **参数:** - `name` (必需): 迁移名称(如:`create_users_table`) **选项:** - `--table`: 表名(如果不从迁移名称中提取) - `--plugin`: 插件路径(如果不在插件目录中运行) **示例:** ```bash # 从插件目录运行 cd plugins/MyPlugin php artisan dev:make-migration create_products_table # 指定插件路径 php artisan dev:make-migration create_products_table \ --table=products \ --plugin=plugins/MyPlugin ``` ### 验证命令 #### `dev:validate-plugin` / `devtools:validate-plugin` 验证插件是否符合 InnoShop 开发规范。 **参数:** - `path` (必需): 插件路径(相对或绝对路径) **验证项:** - ✅ `config.json` 格式和必需字段 - ✅ `Boot.php` 存在性和格式 - ✅ 目录结构是否符合规范 - ✅ 命名规范(PascalCase) - ✅ 语言包完整性 **示例:** ```bash # 使用相对路径 php artisan dev:validate-plugin plugins/MyPlugin # 使用绝对路径 php artisan dev:validate-plugin /path/to/MyPlugin ``` **输出示例:** ``` Validating plugin: /path/to/plugins/MyPlugin... ✓ Plugin validation passed! Warnings: - Missing recommended directory: Services ``` #### `dev:validate-theme` / `devtools:validate-theme` 验证主题是否符合规范。 **参数:** - `path` (必需): 主题路径 **示例:** ```bash php artisan dev:validate-theme themes/modern_shop ``` ### Git 初始化命令 #### `dev:set-gitea-token` / `devtools:set-gitea-token` 保存 Gitea API token 以便后续使用,避免每次都需要输入 token。 **参数:** - `token` (可选): Gitea API token(如果不提供,会提示输入) **选项:** - `--gitea-url`: Gitea 服务器地址(默认:`https://innoshop.work`) - `--storage`: 保存到 `storage/app/.gitea_token` 文件而不是 `.env` 文件 - `--clear`: 清除已保存的 token **功能:** - 默认将 token 保存到 `.env` 文件(`GITEA_TOKEN` 和 `GITEA_URL`) - 使用 `--storage` 选项可保存到 `storage/app/.gitea_token` 文件(JSON 格式) - 后续使用 `dev:init-git` 命令时会自动从 `.env` 或 `storage` 读取保存的 token - `.env` 文件已在 `.gitignore` 中,不会被提交到版本控制 **示例:** ```bash # 保存 token 到 .env 文件(推荐) php artisan dev:set-gitea-token your_gitea_token # 保存 token(交互式输入,更安全) php artisan dev:set-gitea-token # 保存 token 到 storage 目录 php artisan dev:set-gitea-token your_gitea_token --storage # 清除已保存的 token php artisan dev:set-gitea-token --clear ``` **获取 Gitea Token:** 1. 登录 https://innoshop.work 2. 进入 设置 → 应用 → 生成新令牌 3. 选择权限:`write:repository` 和 `read:repository` 4. 复制生成的 token #### `dev:init-git` / `devtools:init-git` 初始化插件的 Git 仓库并推送到 innoshop.work。 **参数:** - `plugin` (必需): 插件文件夹名称 **选项:** - `--gitea-url`: Gitea 服务器地址(默认:从 `.env` 或 `storage` 读取,或 `https://innoshop.work`) - `--gitea-token`: Gitea API Token(默认:从 `.env` 或 `storage` 读取) - `--org`: 组织名称(默认:`splugins`) - `--private`: 创建私有仓库(默认:true) - `--commit-message`: 提交信息(默认:`Initial commit`) - `--force`: 强制重新初始化已存在的 Git 仓库 **功能:** 1. 初始化 Git 仓库(如果不存在) 2. 设置远程仓库地址:`git@innoshop.work:splugins/{plugin}.git` 3. 通过 API 创建远程仓库(如果提供了 token 或已保存 token) 4. 添加所有文件并创建初始提交 5. 推送到远程仓库的 `main` 分支 **示例:** ```bash # 使用已保存的 token(推荐) php artisan dev:init-git Wintopay # 使用命令行参数指定 token php artisan dev:init-git Wintopay \ --gitea-token=your_gitea_token # 自定义提交信息 php artisan dev:init-git Wintopay \ --commit-message="Initial commit: Wintopay plugin" # 强制重新初始化 php artisan dev:init-git Wintopay --force ``` **提示:** - 如果已使用 `dev:set-gitea-token` 保存了 token,可以直接运行 `dev:init-git` 而无需提供 `--gitea-token` 参数 - Token 会自动从 `.env` 文件(`GITEA_TOKEN`)或 `storage/app/.gitea_token` 文件读取 - 读取优先级:命令行参数 > `.env` 文件 > `storage/app/.gitea_token` 文件 ### 发布命令 #### `dev:publish-plugin` / `devtools:publish-plugin` 打包并发布插件到 InnoShop 官方市场。 **参数:** - `path` (可选): 插件路径,默认为当前目录 **选项:** - `--dry-run`: 仅创建包,不上传到市场 - `--skip-validation`: 跳过验证步骤 **发布流程:** 1. 验证插件规范(除非使用 `--skip-validation`) 2. 读取 `config.json` 获取插件信息 3. 创建 ZIP 包(排除 `.git`、`node_modules` 等) 4. 上传到市场 API 5. 显示发布结果 **示例:** ```bash # 从插件目录运行 cd plugins/MyPlugin php artisan dev:publish-plugin # 指定插件路径 php artisan dev:publish-plugin plugins/MyPlugin # 仅打包,不上传(用于测试) php artisan dev:publish-plugin --dry-run # 跳过验证(不推荐) php artisan dev:publish-plugin --skip-validation ``` **输出示例:** ``` Validating plugin... ✓ Plugin validation passed! Package: my_plugin v1.0.0 Creating package... Package created: /path/to/storage/app/temp_packages/my_plugin-v1.0.0.zip Uploading to marketplace... ✓ Plugin published successfully! ``` #### `dev:publish-theme` / `devtools:publish-theme` 打包并发布主题到市场。 **参数和选项:** 与 `publish-plugin` 相同 **示例:** ```bash php artisan dev:publish-theme themes/modern_shop ``` #### `dev:init-git` / `devtools:init-git` 初始化插件的 Git 仓库并推送到 innoshop.work。 **参数:** - `plugin` (必需): 插件文件夹名称 **选项:** - `--gitea-url`: Gitea 服务器地址(默认:`https://innoshop.work`) - `--gitea-token`: Gitea API Token(创建仓库时需要) - `--org`: 组织名称(默认:`splugins`) - `--private`: 创建私有仓库(默认:true) - `--commit-message`: 提交信息(默认:`Initial commit`) - `--force`: 强制重新初始化已存在的 Git 仓库 **功能:** 1. 初始化 Git 仓库(如果不存在) 2. 设置远程仓库地址:`git@innoshop.work:splugins/{plugin}.git` 3. 通过 API 创建远程仓库(如果提供了 token) 4. 添加所有文件并创建初始提交 5. 推送到远程仓库的 `main` 分支 **示例:** ```bash # 基础用法(需要手动创建远程仓库) php artisan dev:init-git Wintopay # 自动创建远程仓库 php artisan dev:init-git Wintopay \ --gitea-token=your_gitea_token # 自定义提交信息 php artisan dev:init-git Wintopay \ --gitea-token=your_gitea_token \ --commit-message="Initial commit: Wintopay plugin" # 强制重新初始化 php artisan dev:init-git Wintopay \ --gitea-token=your_gitea_token \ --force ``` **获取 Gitea Token:** 1. 登录 https://innoshop.work 2. 进入 设置 → 应用 → 生成新令牌 3. 选择权限:`write:repository` 和 `read:repository` 4. 复制生成的 token ## 💡 使用示例 ### 完整开发流程 #### 1. 创建插件 ```bash php artisan dev:make-plugin BlogSystem \ --type=feature \ --with-controller \ --with-model \ --with-migration \ --name-zh="博客系统" \ --name-en="Blog System" ``` #### 2. 添加更多组件 ```bash # 生成服务类 php artisan dev:make-service BlogSystem/BlogService # 生成仓储类 php artisan dev:make-repository BlogSystem/BlogRepo --model=Blog # 生成额外的控制器 php artisan dev:make-controller BlogSystem/Admin/BlogController ``` #### 3. 验证插件 ```bash php artisan dev:validate-plugin plugins/BlogSystem ``` #### 4. 初始化 Git 并推送到远程 ```bash # 初始化 Git 并推送到 innoshop.work php artisan dev:init-git BlogSystem \ --gitea-token=your_gitea_token \ --commit-message="Initial commit: Blog System plugin" ``` #### 5. 发布插件 ```bash # 先测试打包 php artisan dev:publish-plugin plugins/BlogSystem --dry-run # 确认无误后正式发布 php artisan dev:publish-plugin plugins/BlogSystem ``` ### 主题开发流程 ```bash # 1. 创建主题 php artisan dev:make-theme elegant_store \ --name-zh="优雅商店" \ --name-en="Elegant Store" # 2. 验证主题 php artisan dev:validate-theme themes/elegant_store # 3. 发布主题 php artisan dev:publish-theme themes/elegant_store ``` ### 完整开发流程(包含 Git) ```bash # 1. 创建插件 php artisan dev:make-plugin MyPlugin --type=feature # 2. 开发插件功能... # 3. 初始化 Git 并推送 php artisan dev:init-git MyPlugin \ --gitea-token=your_token \ --commit-message="Initial commit" # 4. 验证插件 php artisan dev:validate-plugin plugins/MyPlugin # 5. 发布到市场 php artisan dev:publish-plugin plugins/MyPlugin ``` ## 🎯 最佳实践 ### 插件开发 1. **命名规范** - 插件名称使用 PascalCase:`StripePayment` ✅ - 避免使用下划线或连字符:`stripe_payment` ❌ 2. **目录结构** - 遵循标准目录结构 - 使用推荐的目录名称(Controllers, Models, Services 等) 3. **配置文件** - 确保 `config.json` 包含所有必需字段 - 提供完整的多语言名称和描述 4. **代码组织** - 使用 Service 层处理业务逻辑 - 使用 Repository 层处理数据访问 - Controller 保持轻量,只负责请求处理 5. **语言包** - 至少提供 `en` 和 `zh-cn` 语言包 - 使用语言包而不是硬编码文本 ### 发布前检查清单 - [ ] 运行 `dev:validate-plugin` 确保没有错误 - [ ] 检查 `config.json` 中的版本号 - [ ] 确保所有必需文件都存在 - [ ] 使用 `--dry-run` 测试打包 - [ ] 检查 ZIP 包内容是否正确 ### 版本管理 发布前更新 `config.json` 中的版本号: ```json { "version": "v1.0.1" } ``` ## ❓ 常见问题 ### Q: 命令找不到? **A:** 确保 ServiceProvider 已正确注册。运行: ```bash php artisan package:discover ``` ### Q: 如何自定义模板? **A:** 模板文件位于 `innopacks/devtools/src/Templates/`,你可以修改这些模板文件来自定义生成的内容。 ### Q: 发布失败怎么办? **A:** 检查以下几点: 1. 确保已配置 `domain_token`(在系统设置中) 2. 检查网络连接 3. 使用 `--dry-run` 先测试打包 4. 查看错误信息,通常会有具体提示 ### Q: 如何排除特定文件不被打包? **A:** 在 `config/devtools.php` 中的 `exclude_patterns` 数组添加排除规则。 ### Q: 支持哪些插件类型? **A:** 支持的插件类型: - `feature` - 功能模块 - `marketing` - 营销工具 - `billing` - 支付方式 - `shipping` - 物流方式 - `fee` - 订单费用 - `social` - 社交登录 - `language` - 语言包 - `translator` - 翻译工具 - `intelli` - AI模型 ### Q: 可以在现有插件中使用这些命令吗? **A:** 可以!所有 `make-*` 命令都支持为现有插件生成新文件。只需指定插件名称即可。 ### Q: 命令前缀 `dev:` 和 `devtools:` 有什么区别? **A:** 没有区别,两者完全等价。`dev:` 是简写形式,推荐使用;`devtools:` 是完整形式,用于向后兼容。 ## 📝 配置文件 配置文件位于 `config/devtools.php`,可以自定义: - **模板路径**:自定义模板文件位置 - **插件类型**:添加或修改支持的插件类型 - **排除模式**:自定义打包时排除的文件和目录 ## 🔗 相关资源 - [InnoShop 开发规范](../docs/dev_standard.md) - [插件开发指南](../docs/plugin_development.md) - [主题开发指南](../docs/theme_development.md) ## 📄 许可证 本项目采用 [OSL 3.0](https://opensource.org/licenses/OSL-3.0) 许可证。 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! --- **InnoShop DevTools** - 让插件和主题开发更简单!🚀