├── vendor └── .gitignore ├── src ├── functions.php ├── ApplicationInterface.php ├── Models │ └── BuildForm.php └── Commands │ └── BuildCommand.php ├── bin └── bootstrap.php ├── .gitignore ├── composer.json ├── README.md ├── config └── main.php └── composer.lock /vendor/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /src/functions.php: -------------------------------------------------------------------------------- 1 | 6 | */ 7 | -------------------------------------------------------------------------------- /bin/bootstrap.php: -------------------------------------------------------------------------------- 1 | run(); 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # phpstorm project files 2 | .idea 3 | 4 | # netbeans project files 5 | nbproject 6 | 7 | # zend studio for eclipse project files 8 | .buildpath 9 | .project 10 | .settings 11 | 12 | # windows thumbnail cache 13 | Thumbs.db 14 | 15 | # composer itself is not needed 16 | composer.phar 17 | 18 | # Mac DS_Store Files 19 | .DS_Store 20 | 21 | # phpunit itself is not needed 22 | phpunit.phar 23 | # local phpunit config 24 | /phpunit.xml 25 | 26 | # Swoole Auto Complete 27 | swoole-ide-helper.phar 28 | -------------------------------------------------------------------------------- /src/ApplicationInterface.php: -------------------------------------------------------------------------------- 1 | 6 | * 7 | * 系统组件 8 | * @property \Mix\Log\Logger $log 9 | * @property \Mix\Http\Route $route 10 | * @property \Mix\Http\Message\Request|\Mix\Http\Message\Compatible\Request $request 11 | * @property \Mix\Http\Message\Response|\Mix\Http\Message\Compatible\Response $response 12 | * @property \Mix\Http\Error|\Mix\Console\Error $error 13 | * 14 | * 自定义组件 15 | * @property \Mix\Database\PDOConnection|Mix\Database\MasterSlave\PDOConnection $pdo 16 | * @property \Mix\Redis\RedisConnection $redis 17 | * @property \Mix\Database\Pool\ConnectionPool $pdoPool 18 | * @property \Mix\Redis\Pool\ConnectionPool $redisPool 19 | */ 20 | interface ApplicationInterface 21 | { 22 | } 23 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mix/mix-phar", 3 | "description": "MixPHP 命令行程序开发 (Phar单执行文件) http://www.mixphp.cn", 4 | "type": "project", 5 | "keywords": [ 6 | "framework", 7 | "mixphp", 8 | "swoole" 9 | ], 10 | "homepage": "http://www.mixphp.cn/", 11 | "license": "Apache-2.0", 12 | "authors": [ 13 | { 14 | "name": "liu,jian", 15 | "email": "coder.keda@gmail.com" 16 | } 17 | ], 18 | "require": { 19 | "php": ">=7.0.0", 20 | "ext-mbstring": "*", 21 | "mix/framework": "~2.0.0", 22 | "mix/console": "~2.0.0", 23 | "mix/log": "~2.0.0", 24 | "mix/validate": "~2.0.0" 25 | }, 26 | "autoload": { 27 | "psr-4": { 28 | "Phar\\": "src/" 29 | }, 30 | "classmap": [ 31 | "src/ApplicationInterface.php" 32 | ], 33 | "files": [ 34 | "src/functions.php" 35 | ] 36 | }, 37 | "repositories": { 38 | "packagist": { 39 | "type": "composer", 40 | "url": "https://packagist.laravel-china.org" 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/Models/BuildForm.php: -------------------------------------------------------------------------------- 1 | 11 | */ 12 | class BuildForm extends Validator 13 | { 14 | 15 | /** 16 | * @var string 17 | */ 18 | public $dir; 19 | 20 | /** 21 | * @var string 22 | */ 23 | public $output; 24 | 25 | /** 26 | * @var string 27 | */ 28 | public $bootstrap; 29 | 30 | /** 31 | * @var string 32 | */ 33 | public $regex; 34 | 35 | /** 36 | * 规则 37 | * @return array 38 | */ 39 | public function rules() 40 | { 41 | return [ 42 | 'dir' => ['string', 'filter' => ['trim']], 43 | 'output' => ['string', 'filter' => ['trim']], 44 | 'bootstrap' => ['string', 'filter' => ['trim']], 45 | 'regex' => ['string', 'filter' => ['trim']], 46 | ]; 47 | } 48 | 49 | /** 50 | * 场景 51 | * @return array 52 | */ 53 | public function scenarios() 54 | { 55 | return [ 56 | 'main' => ['required' => ['dir', 'output'], 'optional' => ['bootstrap', 'regex']], 57 | ]; 58 | } 59 | 60 | /** 61 | * 消息 62 | * @return array 63 | */ 64 | public function messages() 65 | { 66 | return [ 67 | 'dir.required' => '\'-d/--dir\' option cannot be empty.', 68 | 'output.required' => '\'-o/--output\' option cannot be empty.', 69 | ]; 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/Commands/BuildCommand.php: -------------------------------------------------------------------------------- 1 | 12 | */ 13 | class BuildCommand 14 | { 15 | 16 | /** 17 | * 主函数 18 | */ 19 | public function main() 20 | { 21 | // phar.readonly检查 22 | if (ini_get('phar.readonly')) { 23 | println("Please use 'php -d phar.readonly=0 mix-pack.phar build opt...'"); 24 | exit; 25 | } 26 | // 获取参数 27 | $argv = [ 28 | 'dir' => Flag::string(['d', 'dir'], ''), 29 | 'output' => Flag::string(['o', 'output'], ''), 30 | 'bootstrap' => Flag::string(['b', 'bootstrap'], ''), 31 | 'regex' => Flag::string(['r', 'regex'], ''), 32 | ]; 33 | // 使用模型 34 | $model = new BuildForm(); 35 | $model->attributes = $argv; 36 | $model->setScenario('main'); 37 | if (!$model->validate()) { 38 | println($model->getError()); 39 | exit; 40 | } 41 | // 打包 42 | $phar = new \Phar($model->output); 43 | $phar->startBuffering(); 44 | $phar->buildFromDirectory($model->dir, $model->regex); 45 | $phar->setStub('#!/usr/bin/env php' . "\n" . $phar->createDefaultStub(str_replace('\\', '/', $model->bootstrap))); 46 | $phar->stopBuffering(); 47 | // 完成 48 | println("Build successfully!"); 49 | println(" - Phar file: {$model->output}"); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Mix Pack 2 | 3 | 将 PHP 项目打包成 Phar 文件的工具 4 | 5 | A tool for packaging PHP projects into Phar files 6 | 7 | ## 下载 (Download) 8 | 9 | - [mix-pack.phar v1.0.2](https://github.com/mix-php/mix-pack/releases/download/v1.0.2/mix-pack.phar) 10 | - [mix-pack.phar v1.0.1](https://github.com/mix-php/mix-pack/releases/download/v1.0.1/mix-pack.phar) 11 | 12 | ## 使用 (Usage) 13 | 14 | 执行打包任务: 15 | 16 | ``` 17 | php mix-pack.phar build -d /data/app -o /data/app.phar -b bin/bootstrap.php 18 | ``` 19 | 20 | 如果 `phar.readonly` 没有关闭,按如下方法执行: 21 | 22 | ``` 23 | php -d phar.readonly=0 mix-pack.phar build -d /data/app -o /data/app.phar -b bin/bootstrap.php 24 | ``` 25 | 26 | 打包成功: 27 | 28 | ``` 29 | Build successfully! 30 | - Phar file: /data/app.phar 31 | ``` 32 | 33 | ## 执行打包文件 (Phar) 34 | 35 | - windows 36 | 37 | 指定 php 执行 38 | 39 | ``` 40 | C:\project>php app.phar 41 | ``` 42 | 43 | - linux 44 | 45 | 指定 php 执行 46 | 47 | ``` 48 | $> php app.phar 49 | ``` 50 | 51 | 通过环境变量的默认 php 执行 52 | 53 | ``` 54 | $> ./app.phar 55 | ``` 56 | 57 | ## 全部命令参数 58 | 59 | ``` 60 | php mix-pack.phar build --help 61 | ``` 62 | 63 | - `-d, --dir` The project directory to be packaged 64 | - `-o, --output` The name of the output phar file 65 | - `-b, --bootstrap` The path to the Bootstrap file 66 | - `-r, --regex` Extract regular expressions 67 | 68 | ## 打包的目录 69 | 70 | 指定要打包的 PHP 项目所在的目录 71 | 72 | ``` 73 | php mix-pack.phar build --dir=/data/app 74 | ``` 75 | 76 | 也可使用短参数 77 | 78 | ``` 79 | php mix-pack.phar build -d /data/app 80 | ``` 81 | 82 | ## 输出的 Phar 路径 83 | 84 | 指定打包后输出的 Phar 文件的路径,必须 `.phar` 后缀 85 | 86 | ``` 87 | php mix-pack.phar build --output=/data/app.phar 88 | ``` 89 | 90 | 也可使用短参数 91 | 92 | ``` 93 | php mix-pack.phar build -o /data/app.phar 94 | ``` 95 | 96 | ## 引导文件 97 | 98 | 设置 Phar 文件执行时,引入的入口文件,**只能是相对路径** 99 | 100 | > 非必须参数 101 | 102 | ``` 103 | php mix-pack.phar build --bootstrap=bin/bootstrap.php 104 | ``` 105 | 106 | 也可使用短参数 107 | 108 | ``` 109 | php mix-pack.phar build -b bin/bootstrap.php 110 | ``` 111 | 112 | ## 文件提取正则 113 | 114 | 设置打包时提取文件的正则表达式,用于过滤掉一些不需要的文件 115 | 116 | > 非必须参数 117 | 118 | ``` 119 | php mix-pack.phar build --regex="/\.php$/" 120 | ``` 121 | 122 | 也可使用短参数 123 | 124 | ``` 125 | php mix-pack.phar build -r "/\.php$/" 126 | ``` 127 | 128 | ## License 129 | 130 | Apache License Version 2.0, http://www.apache.org/licenses/ 131 | -------------------------------------------------------------------------------- /config/main.php: -------------------------------------------------------------------------------- 1 | 'mix-pack', 8 | 9 | // 应用版本 10 | 'appVersion' => '1.0.2', 11 | 12 | // 应用调试 13 | 'appDebug' => false, 14 | 15 | // 基础路径 16 | 'basePath' => str_replace(['phar://', '/'], ['', DIRECTORY_SEPARATOR], dirname(dirname(__DIR__))), 17 | 18 | // 运行目录路径 19 | 'runtimePath' => '', 20 | 21 | // 命令命名空间 22 | 'commandNamespace' => 'Phar\Commands', 23 | 24 | // 命令 25 | 'commands' => [ 26 | 27 | 'build' => [ 28 | 'Build', 29 | 'description' => "\t" . "Package the project as a PHAR file.", 30 | 'options' => [ 31 | [['d', 'dir'], 'description' => "\t" . 'The project directory to be packaged'], 32 | [['o', 'output'], 'description' => "\t" . 'The name of the output phar file'], 33 | [['b', 'bootstrap'], 'description' => 'The path to the Bootstrap file'], 34 | [['r', 'regex'], 'description' => "\t" . 'Extract regular expressions'], 35 | ], 36 | ], 37 | 38 | ], 39 | 40 | // 组件配置 41 | 'components' => [ 42 | 43 | // 错误 44 | 'error' => [ 45 | // 依赖引用 46 | 'ref' => beanname(Mix\Console\Error::class), 47 | ], 48 | 49 | // 日志 50 | 'log' => [ 51 | // 依赖引用 52 | 'ref' => beanname(Mix\Log\Logger::class), 53 | ], 54 | 55 | ], 56 | 57 | // 依赖配置 58 | 'beans' => [ 59 | 60 | [ 61 | // 类路径 62 | 'class' => Mix\Console\Error::class, 63 | // 属性 64 | 'properties' => [ 65 | // 错误级别 66 | 'level' => E_ALL, 67 | ], 68 | ], 69 | 70 | // 日志 71 | [ 72 | // 类路径 73 | 'class' => Mix\Log\Logger::class, 74 | // 属性 75 | 'properties' => [ 76 | // 日志记录级别 77 | 'levels' => ['emergency', 'alert', 'critical', 'error', 'warning', 'notice', 'info', 'debug'], 78 | // 处理器 79 | 'handler' => [ 80 | // 依赖引用 81 | 'ref' => beanname(Mix\Log\MultiHandler::class), 82 | ], 83 | ], 84 | ], 85 | 86 | // 日志处理器 87 | [ 88 | // 类路径 89 | 'class' => Mix\Log\MultiHandler::class, 90 | // 属性 91 | 'properties' => [ 92 | // 日志处理器集合 93 | 'handlers' => [ 94 | // 标准输出处理器 95 | [ 96 | // 依赖引用 97 | 'ref' => beanname(Mix\Log\StdoutHandler::class), 98 | ], 99 | // 文件处理器 100 | [ 101 | // 依赖引用 102 | 'ref' => beanname(Mix\Log\FileHandler::class), 103 | ], 104 | ], 105 | ], 106 | ], 107 | 108 | // 日志标准输出处理器 109 | [ 110 | // 类路径 111 | 'class' => Mix\Log\StdoutHandler::class, 112 | ], 113 | 114 | // 日志文件处理器 115 | [ 116 | // 类路径 117 | 'class' => Mix\Log\FileHandler::class, 118 | ], 119 | 120 | ], 121 | 122 | ]; 123 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "0b0ce4a06d5820387d4f490f5a23c53f", 8 | "packages": [ 9 | { 10 | "name": "mix/console", 11 | "version": "v2.0.3", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/mix-php/mix-console.git", 15 | "reference": "2d176b920c0764a20c60be96150e6aa531f0c528" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/mix-php/mix-console/zipball/2d176b920c0764a20c60be96150e6aa531f0c528", 20 | "reference": "2d176b920c0764a20c60be96150e6aa531f0c528", 21 | "shasum": "", 22 | "mirrors": [ 23 | { 24 | "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", 25 | "preferred": true 26 | } 27 | ] 28 | }, 29 | "require": { 30 | "mix/framework": "~2.0.0", 31 | "php": ">=7.0.0" 32 | }, 33 | "type": "framework", 34 | "autoload": { 35 | "psr-4": { 36 | "Mix\\Console\\": "src/" 37 | } 38 | }, 39 | "notification-url": "https://packagist.org/downloads/", 40 | "license": [ 41 | "Apache-2.0" 42 | ], 43 | "authors": [ 44 | { 45 | "name": "liu,jian", 46 | "email": "coder.keda@gmail.com" 47 | } 48 | ], 49 | "description": "MixPHP 框架模块 http://www.mixphp.cn", 50 | "homepage": "http://www.mixphp.cn/", 51 | "keywords": [ 52 | "framework", 53 | "mixphp", 54 | "swoole" 55 | ], 56 | "time": "2019-05-09T02:50:35+00:00" 57 | }, 58 | { 59 | "name": "mix/framework", 60 | "version": "v2.0.5", 61 | "source": { 62 | "type": "git", 63 | "url": "https://github.com/mix-php/mix-framework.git", 64 | "reference": "8f6cb9cc60abe54f7c7bf8e8595c15361e5ac667" 65 | }, 66 | "dist": { 67 | "type": "zip", 68 | "url": "https://api.github.com/repos/mix-php/mix-framework/zipball/8f6cb9cc60abe54f7c7bf8e8595c15361e5ac667", 69 | "reference": "8f6cb9cc60abe54f7c7bf8e8595c15361e5ac667", 70 | "shasum": "", 71 | "mirrors": [ 72 | { 73 | "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", 74 | "preferred": true 75 | } 76 | ] 77 | }, 78 | "require": { 79 | "php": ">=7.0.0", 80 | "psr/container": "~1.0" 81 | }, 82 | "type": "framework", 83 | "autoload": { 84 | "psr-4": { 85 | "Mix\\": "src/" 86 | }, 87 | "classmap": [ 88 | "src/Mix.php" 89 | ], 90 | "files": [ 91 | "src/functions.php" 92 | ] 93 | }, 94 | "notification-url": "https://packagist.org/downloads/", 95 | "license": [ 96 | "Apache-2.0" 97 | ], 98 | "authors": [ 99 | { 100 | "name": "liu,jian", 101 | "email": "coder.keda@gmail.com" 102 | } 103 | ], 104 | "description": "MixPHP 框架核心 http://www.mixphp.cn", 105 | "homepage": "http://www.mixphp.cn/", 106 | "keywords": [ 107 | "framework", 108 | "mixphp", 109 | "swoole" 110 | ], 111 | "time": "2019-05-23T04:17:55+00:00" 112 | }, 113 | { 114 | "name": "mix/log", 115 | "version": "v2.0.2", 116 | "source": { 117 | "type": "git", 118 | "url": "https://github.com/mix-php/mix-log.git", 119 | "reference": "6e725fa9d101057b8398f66711bfd29977db60e2" 120 | }, 121 | "dist": { 122 | "type": "zip", 123 | "url": "https://api.github.com/repos/mix-php/mix-log/zipball/6e725fa9d101057b8398f66711bfd29977db60e2", 124 | "reference": "6e725fa9d101057b8398f66711bfd29977db60e2", 125 | "shasum": "", 126 | "mirrors": [ 127 | { 128 | "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", 129 | "preferred": true 130 | } 131 | ] 132 | }, 133 | "require": { 134 | "mix/framework": "~2.0.0", 135 | "php": ">=7.0.0", 136 | "psr/log": "~1.0" 137 | }, 138 | "type": "framework", 139 | "autoload": { 140 | "psr-4": { 141 | "Mix\\Log\\": "src/" 142 | } 143 | }, 144 | "notification-url": "https://packagist.org/downloads/", 145 | "license": [ 146 | "Apache-2.0" 147 | ], 148 | "authors": [ 149 | { 150 | "name": "liu,jian", 151 | "email": "coder.keda@gmail.com" 152 | } 153 | ], 154 | "description": "MixPHP 框架模块 http://www.mixphp.cn", 155 | "homepage": "http://www.mixphp.cn/", 156 | "keywords": [ 157 | "framework", 158 | "mixphp", 159 | "swoole" 160 | ], 161 | "time": "2019-05-09T02:51:07+00:00" 162 | }, 163 | { 164 | "name": "mix/validate", 165 | "version": "v2.0.4", 166 | "source": { 167 | "type": "git", 168 | "url": "https://github.com/mix-php/mix-validate.git", 169 | "reference": "a0a80a7a70b540105f2856fe241da1a40480c401" 170 | }, 171 | "dist": { 172 | "type": "zip", 173 | "url": "https://api.github.com/repos/mix-php/mix-validate/zipball/a0a80a7a70b540105f2856fe241da1a40480c401", 174 | "reference": "a0a80a7a70b540105f2856fe241da1a40480c401", 175 | "shasum": "", 176 | "mirrors": [ 177 | { 178 | "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", 179 | "preferred": true 180 | } 181 | ] 182 | }, 183 | "require": { 184 | "mix/framework": "~2.0.0", 185 | "php": ">=7.0.0" 186 | }, 187 | "type": "framework", 188 | "autoload": { 189 | "psr-4": { 190 | "Mix\\Validate\\": "src/" 191 | } 192 | }, 193 | "notification-url": "https://packagist.org/downloads/", 194 | "license": [ 195 | "Apache-2.0" 196 | ], 197 | "authors": [ 198 | { 199 | "name": "liu,jian", 200 | "email": "coder.keda@gmail.com" 201 | } 202 | ], 203 | "description": "MixPHP 框架模块 http://www.mixphp.cn", 204 | "homepage": "http://www.mixphp.cn/", 205 | "keywords": [ 206 | "framework", 207 | "mixphp", 208 | "swoole" 209 | ], 210 | "time": "2019-05-17T02:43:06+00:00" 211 | }, 212 | { 213 | "name": "psr/container", 214 | "version": "1.0.0", 215 | "source": { 216 | "type": "git", 217 | "url": "https://github.com/php-fig/container.git", 218 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 219 | }, 220 | "dist": { 221 | "type": "zip", 222 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 223 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 224 | "shasum": "", 225 | "mirrors": [ 226 | { 227 | "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", 228 | "preferred": true 229 | } 230 | ] 231 | }, 232 | "require": { 233 | "php": ">=5.3.0" 234 | }, 235 | "type": "library", 236 | "extra": { 237 | "branch-alias": { 238 | "dev-master": "1.0.x-dev" 239 | } 240 | }, 241 | "autoload": { 242 | "psr-4": { 243 | "Psr\\Container\\": "src/" 244 | } 245 | }, 246 | "notification-url": "https://packagist.org/downloads/", 247 | "license": [ 248 | "MIT" 249 | ], 250 | "authors": [ 251 | { 252 | "name": "PHP-FIG", 253 | "homepage": "http://www.php-fig.org/" 254 | } 255 | ], 256 | "description": "Common Container Interface (PHP FIG PSR-11)", 257 | "homepage": "https://github.com/php-fig/container", 258 | "keywords": [ 259 | "PSR-11", 260 | "container", 261 | "container-interface", 262 | "container-interop", 263 | "psr" 264 | ], 265 | "time": "2017-02-14T16:28:37+00:00" 266 | }, 267 | { 268 | "name": "psr/log", 269 | "version": "1.1.0", 270 | "source": { 271 | "type": "git", 272 | "url": "https://github.com/php-fig/log.git", 273 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" 274 | }, 275 | "dist": { 276 | "type": "zip", 277 | "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 278 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 279 | "shasum": "", 280 | "mirrors": [ 281 | { 282 | "url": "https://dl.laravel-china.org/%package%/%reference%.%type%", 283 | "preferred": true 284 | } 285 | ] 286 | }, 287 | "require": { 288 | "php": ">=5.3.0" 289 | }, 290 | "type": "library", 291 | "extra": { 292 | "branch-alias": { 293 | "dev-master": "1.0.x-dev" 294 | } 295 | }, 296 | "autoload": { 297 | "psr-4": { 298 | "Psr\\Log\\": "Psr/Log/" 299 | } 300 | }, 301 | "notification-url": "https://packagist.org/downloads/", 302 | "license": [ 303 | "MIT" 304 | ], 305 | "authors": [ 306 | { 307 | "name": "PHP-FIG", 308 | "homepage": "http://www.php-fig.org/" 309 | } 310 | ], 311 | "description": "Common interface for logging libraries", 312 | "homepage": "https://github.com/php-fig/log", 313 | "keywords": [ 314 | "log", 315 | "psr", 316 | "psr-3" 317 | ], 318 | "time": "2018-11-20T15:27:04+00:00" 319 | } 320 | ], 321 | "packages-dev": [], 322 | "aliases": [], 323 | "minimum-stability": "stable", 324 | "stability-flags": [], 325 | "prefer-stable": false, 326 | "prefer-lowest": false, 327 | "platform": { 328 | "php": ">=7.0.0", 329 | "ext-mbstring": "*" 330 | }, 331 | "platform-dev": [] 332 | } 333 | --------------------------------------------------------------------------------