puli /
cli
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | /* |
||
| 4 | * This file is part of the puli/cli package. |
||
| 5 | * |
||
| 6 | * (c) Bernhard Schussek <[email protected]> |
||
| 7 | * |
||
| 8 | * For the full copyright and license information, please view the LICENSE |
||
| 9 | * file that was distributed with this source code. |
||
| 10 | */ |
||
| 11 | |||
| 12 | namespace Puli\Cli; |
||
| 13 | |||
| 14 | use Puli\Cli\Handler\BindCommandHandler; |
||
| 15 | use Puli\Cli\Handler\BuildCommandHandler; |
||
| 16 | use Puli\Cli\Handler\CatCommandHandler; |
||
| 17 | use Puli\Cli\Handler\ConfigCommandHandler; |
||
| 18 | use Puli\Cli\Handler\FindCommandHandler; |
||
| 19 | use Puli\Cli\Handler\InstallerCommandHandler; |
||
| 20 | use Puli\Cli\Handler\LsCommandHandler; |
||
| 21 | use Puli\Cli\Handler\MapCommandHandler; |
||
| 22 | use Puli\Cli\Handler\PackageCommandHandler; |
||
| 23 | use Puli\Cli\Handler\PluginCommandHandler; |
||
| 24 | use Puli\Cli\Handler\PublishCommandHandler; |
||
| 25 | use Puli\Cli\Handler\SelfUpdateCommandHandler; |
||
| 26 | use Puli\Cli\Handler\ServerCommandHandler; |
||
| 27 | use Puli\Cli\Handler\TreeCommandHandler; |
||
| 28 | use Puli\Cli\Handler\TypeCommandHandler; |
||
| 29 | use Puli\Cli\Handler\UpgradeCommandHandler; |
||
| 30 | use Puli\Cli\Handler\UrlCommandHandler; |
||
| 31 | use Puli\Cli\Proxy\DiscoveryManagerProxy; |
||
| 32 | use Puli\Cli\Proxy\RepositoryManagerProxy; |
||
| 33 | use Puli\Manager\Api\Context\ProjectContext; |
||
| 34 | use Puli\Manager\Api\Package\InstallInfo; |
||
| 35 | use Puli\Manager\Api\Package\PackageFile; |
||
| 36 | use Puli\Manager\Api\Puli; |
||
| 37 | use Puli\Manager\Api\Server\Server; |
||
| 38 | use Webmozart\Console\Api\Args\Format\Argument; |
||
| 39 | use Webmozart\Console\Api\Args\Format\Option; |
||
| 40 | use Webmozart\Console\Api\Event\ConsoleEvents; |
||
| 41 | use Webmozart\Console\Api\Event\PreHandleEvent; |
||
| 42 | use Webmozart\Console\Api\Formatter\Style; |
||
| 43 | use Webmozart\Console\Config\DefaultApplicationConfig; |
||
| 44 | |||
| 45 | /** |
||
| 46 | * The configuration of the Puli CLI. |
||
| 47 | * |
||
| 48 | * @since 1.0 |
||
| 49 | * |
||
| 50 | * @author Bernhard Schussek <[email protected]> |
||
| 51 | * @author Stephan Wentz <[email protected]> |
||
| 52 | */ |
||
| 53 | class PuliApplicationConfig extends DefaultApplicationConfig |
||
| 54 | { |
||
| 55 | /** |
||
| 56 | * The version of the Puli CLI. |
||
| 57 | */ |
||
| 58 | const VERSION = '@package_version@'; |
||
| 59 | |||
| 60 | /** |
||
| 61 | * @var Puli |
||
| 62 | */ |
||
| 63 | private $puli; |
||
| 64 | |||
| 65 | /** |
||
| 66 | * Creates the configuration. |
||
| 67 | * |
||
| 68 | * @param Puli $puli The Puli service container. |
||
| 69 | */ |
||
| 70 | public function __construct(Puli $puli = null) |
||
| 71 | { |
||
| 72 | // Start Puli already so that plugins can change the CLI configuration |
||
| 73 | $this->puli = $puli ?: new Puli(getcwd()); |
||
| 74 | |||
| 75 | if (!$this->puli->isStarted()) { |
||
| 76 | $this->puli->start(); |
||
| 77 | } |
||
| 78 | |||
| 79 | parent::__construct(); |
||
| 80 | } |
||
| 81 | |||
| 82 | /** |
||
| 83 | * {@inheritdoc} |
||
| 84 | */ |
||
| 85 | protected function configure() |
||
| 86 | { |
||
| 87 | // Make sure the console and Puli use the same event dispatcher so that |
||
| 88 | // Puli plugins can listen to the console events. |
||
| 89 | // Add the dispatcher before parent::configure() so that the parent |
||
| 90 | // listeners don't get overwritten. |
||
| 91 | $this->setEventDispatcher($this->puli->getEventDispatcher()); |
||
| 92 | |||
| 93 | parent::configure(); |
||
| 94 | |||
| 95 | $puli = $this->puli; |
||
| 96 | $context = $this->puli->getContext(); |
||
| 97 | |||
| 98 | $this |
||
| 99 | ->setName('puli') |
||
| 100 | ->setDisplayName('Puli') |
||
| 101 | ->setVersion(self::VERSION) |
||
| 102 | |||
| 103 | // Enable debug for unreleased versions only. Split the string to |
||
| 104 | // prevent its replacement during release |
||
| 105 | ->setDebug('@pack'.'age_version@' === self::VERSION) |
||
| 106 | |||
| 107 | ->addStyle(Style::tag('good')->fgGreen()) |
||
| 108 | ->addStyle(Style::tag('bad')->fgRed()) |
||
| 109 | ; |
||
| 110 | |||
| 111 | if ($context instanceof ProjectContext) { |
||
|
0 ignored issues
–
show
|
|||
| 112 | // Don't do a version check in the global context (if not in a project) |
||
| 113 | $this->addEventListener( |
||
| 114 | ConsoleEvents::PRE_HANDLE, |
||
| 115 | function (PreHandleEvent $event) use ($context) { |
||
| 116 | $io = $event->getIO(); |
||
| 117 | $packageFile = $context->getRootPackageFile(); |
||
| 118 | |||
| 119 | // Don't show warning for "upgrade" command |
||
| 120 | if ('upgrade' === $event->getCommand()->getName()) { |
||
| 121 | return; |
||
| 122 | } |
||
| 123 | |||
| 124 | if (version_compare($packageFile->getVersion(), PackageFile::DEFAULT_VERSION, '<')) { |
||
| 125 | $io->errorLine(sprintf( |
||
| 126 | '<warn>Warning: Your puli.json file has version %s, '. |
||
| 127 | 'but the latest version is %s. Run "puli upgrade" to '. |
||
| 128 | 'upgrade to %s.</warn>', |
||
| 129 | $packageFile->getVersion(), |
||
| 130 | PackageFile::DEFAULT_VERSION, |
||
| 131 | PackageFile::DEFAULT_VERSION |
||
| 132 | )); |
||
| 133 | } |
||
| 134 | } |
||
| 135 | ); |
||
| 136 | } |
||
| 137 | |||
| 138 | $this |
||
| 139 | ->beginCommand('bind') |
||
| 140 | ->setDescription('Bind resources to binding types') |
||
| 141 | ->setHandler(function () use ($puli) { |
||
| 142 | return new BindCommandHandler( |
||
| 143 | $puli->getDiscoveryManager(), |
||
| 144 | $puli->getPackageManager()->getPackages() |
||
| 145 | ); |
||
| 146 | }) |
||
| 147 | |||
| 148 | ->beginOptionCommand('add') |
||
| 149 | ->markAnonymous() |
||
| 150 | ->addArgument('artifact', Argument::REQUIRED, 'A class name or a query for resources') |
||
| 151 | ->addArgument('type', Argument::REQUIRED, 'The name of the binding type') |
||
| 152 | ->addOption('language', null, Option::REQUIRED_VALUE, 'The language of the resource query', 'glob', 'language') |
||
| 153 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A binding parameter in the form <key>=<value>', null, 'key=value') |
||
| 154 | ->addOption('class', null, Option::NO_VALUE, 'Force adding of a class binding') |
||
| 155 | ->addOption('force', 'f', Option::NO_VALUE, 'Add binding even if the binding type does not exist') |
||
| 156 | ->setHandlerMethod('handleAdd') |
||
| 157 | ->end() |
||
| 158 | |||
| 159 | ->beginOptionCommand('list') |
||
| 160 | ->markDefault() |
||
| 161 | ->addOption('root', null, Option::NO_VALUE, 'Show bindings of the root package') |
||
| 162 | ->addOption('package', 'p', Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Show bindings of a package', null, 'package') |
||
| 163 | ->addOption('all', 'a', Option::NO_VALUE, 'Show bindings of all packages') |
||
| 164 | ->addOption('enabled', null, Option::NO_VALUE, 'Show enabled bindings') |
||
| 165 | ->addOption('disabled', null, Option::NO_VALUE, 'Show disabled bindings') |
||
| 166 | ->addOption('type-not-found', null, Option::NO_VALUE, 'Show bindings whose type is not found') |
||
| 167 | ->addOption('type-not-enabled', null, Option::NO_VALUE, 'Show bindings whose type is not enabled') |
||
| 168 | ->addOption('ignored', null, Option::NO_VALUE, 'Show bindings whose type is disabled') |
||
| 169 | ->addOption('invalid', null, Option::NO_VALUE, 'Show bindings with invalid parameters') |
||
| 170 | ->addOption('language', null, Option::REQUIRED_VALUE, 'The language of the resource query', 'glob', 'language') |
||
| 171 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A binding parameter in the form <key>=<value>', null, 'key=value') |
||
| 172 | ->setHandlerMethod('handleList') |
||
| 173 | ->end() |
||
| 174 | |||
| 175 | ->beginOptionCommand('update', 'u') |
||
| 176 | ->addArgument('uuid', Argument::REQUIRED, 'The UUID (prefix) of the updated binding') |
||
| 177 | ->addOption('query', null, Option::REQUIRED_VALUE, 'A query for resources') |
||
| 178 | ->addOption('class', null, Option::REQUIRED_VALUE, 'A class name') |
||
| 179 | ->addOption('type', null, Option::REQUIRED_VALUE, 'The name of the binding type') |
||
| 180 | ->addOption('language', null, Option::REQUIRED_VALUE, 'The language of the resource query', null, 'language') |
||
| 181 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A binding parameter in the form <key>=<value>', null, 'key=value') |
||
| 182 | ->addOption('unset-param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Unset a binding parameter', null, 'key') |
||
| 183 | ->addOption('force', 'f', Option::NO_VALUE, 'Update binding even if the binding type does not exist') |
||
| 184 | ->setHandlerMethod('handleUpdate') |
||
| 185 | ->end() |
||
| 186 | |||
| 187 | ->beginOptionCommand('delete', 'd') |
||
| 188 | ->addArgument('uuid', Argument::REQUIRED, 'The UUID (prefix) of the removed binding') |
||
| 189 | ->setHandlerMethod('handleDelete') |
||
| 190 | ->end() |
||
| 191 | |||
| 192 | ->beginOptionCommand('enable') |
||
| 193 | ->addArgument('uuid', Argument::REQUIRED, 'The UUID (prefix) of the enabled binding') |
||
| 194 | ->setHandlerMethod('handleEnable') |
||
| 195 | ->end() |
||
| 196 | |||
| 197 | ->beginOptionCommand('disable') |
||
| 198 | ->addArgument('uuid', Argument::REQUIRED, 'The UUID (prefix) of the disabled binding') |
||
| 199 | ->setHandlerMethod('handleDisable') |
||
| 200 | ->end() |
||
| 201 | ->end() |
||
| 202 | ; |
||
| 203 | |||
| 204 | $this |
||
| 205 | ->beginCommand('build') |
||
| 206 | ->setDescription('Build the resource repository/discovery') |
||
| 207 | ->addArgument('target', Argument::OPTIONAL, 'The build target. One of "repository", "discovery", "factory" and "all"', 'all') |
||
| 208 | ->setHandler(function () use ($puli) { |
||
| 209 | return new BuildCommandHandler( |
||
| 210 | // Use proxies to make sure this command runs even if |
||
| 211 | // the factory file is corrupt. If the file is corrupt, |
||
| 212 | // we get an error when loading the actual managers. |
||
| 213 | new RepositoryManagerProxy($puli), |
||
| 214 | new DiscoveryManagerProxy($puli), |
||
| 215 | $puli->getFactoryManager() |
||
| 216 | ); |
||
| 217 | }) |
||
| 218 | ->end() |
||
| 219 | ; |
||
| 220 | |||
| 221 | $this |
||
| 222 | ->beginCommand('cat') |
||
| 223 | ->setDescription('Concatenate a file resource in the repository') |
||
| 224 | ->addArgument('path', Argument::REQUIRED, 'The path of a resource') |
||
| 225 | ->setHandler(function () use ($puli) { |
||
| 226 | return new CatCommandHandler( |
||
| 227 | $puli->getRepository() |
||
| 228 | ); |
||
| 229 | }) |
||
| 230 | ->end() |
||
| 231 | ; |
||
| 232 | |||
| 233 | $this |
||
| 234 | ->beginCommand('config') |
||
| 235 | ->setDescription('Display and modify configuration values') |
||
| 236 | ->setHandler(function () use ($puli) { |
||
| 237 | return new ConfigCommandHandler($puli->getRootPackageFileManager()); |
||
| 238 | }) |
||
| 239 | |||
| 240 | ->beginSubCommand('list') |
||
| 241 | ->markDefault() |
||
| 242 | ->addOption('parsed', null, Option::NO_VALUE, 'Replace placeholders by their values in the output') |
||
| 243 | ->setHandlerMethod('handleList') |
||
| 244 | ->end() |
||
| 245 | |||
| 246 | ->beginSubCommand('show') |
||
| 247 | ->markAnonymous() |
||
| 248 | ->addArgument('key', Argument::REQUIRED, 'The configuration key to show. May contain wildcards ("*")') |
||
| 249 | ->addOption('parsed', null, Option::NO_VALUE, 'Replace placeholders by their values in the output') |
||
| 250 | ->setHandlerMethod('handleShow') |
||
| 251 | ->end() |
||
| 252 | |||
| 253 | ->beginSubCommand('set') |
||
| 254 | ->markAnonymous() |
||
| 255 | ->addArgument('key', Argument::REQUIRED, 'The modified configuration key') |
||
| 256 | ->addArgument('value', Argument::REQUIRED, 'The value to set for the configuration key') |
||
| 257 | ->setHandlerMethod('handleSet') |
||
| 258 | ->end() |
||
| 259 | |||
| 260 | ->beginOptionCommand('reset', 'r') |
||
| 261 | ->addArgument('key', Argument::REQUIRED, 'The configuration key(s) to reset. May contain wildcards ("*")') |
||
| 262 | ->setHandlerMethod('handleReset') |
||
| 263 | ->end() |
||
| 264 | ->end() |
||
| 265 | ; |
||
| 266 | |||
| 267 | $this |
||
| 268 | ->beginCommand('find') |
||
| 269 | ->setDescription('Find resources by different criteria') |
||
| 270 | ->addOption('path', null, Option::REQUIRED_VALUE, 'The resource path. May contain the wildcard "*"') |
||
| 271 | ->addOption('name', null, Option::REQUIRED_VALUE, 'The resource filename. May contain the wildcard "*"') |
||
| 272 | ->addOption('class', null, Option::REQUIRED_VALUE, 'The short name of a resource class') |
||
| 273 | ->addOption('type', null, Option::REQUIRED_VALUE, 'The name of a binding type') |
||
| 274 | ->addOption('language', null, Option::REQUIRED_VALUE, 'The language of the query passed with --path', 'glob') |
||
| 275 | ->setHandler(function () use ($puli) { |
||
| 276 | return new FindCommandHandler( |
||
| 277 | $puli->getRepository(), |
||
| 278 | $puli->getDiscovery() |
||
| 279 | ); |
||
| 280 | }) |
||
| 281 | ->end() |
||
| 282 | ; |
||
| 283 | |||
| 284 | $this |
||
| 285 | ->beginCommand('installer') |
||
| 286 | ->setDescription('Manage the installers used to install web resources') |
||
| 287 | ->setHandler(function () use ($puli) { |
||
| 288 | return new InstallerCommandHandler($puli->getInstallerManager()); |
||
| 289 | }) |
||
| 290 | |||
| 291 | ->beginOptionCommand('list') |
||
| 292 | ->markDefault() |
||
| 293 | ->addOption('long', 'l', Option::NO_VALUE, 'Print the fully-qualified class name') |
||
| 294 | ->setHandlerMethod('handleList') |
||
| 295 | ->end() |
||
| 296 | |||
| 297 | ->beginOptionCommand('add', 'a') |
||
| 298 | ->addArgument('name', Argument::REQUIRED, 'The name of the installer') |
||
| 299 | ->addArgument('class', Argument::REQUIRED, 'The fully-qualified class name of the installer') |
||
| 300 | ->addOption('description', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'The description of the installer') |
||
| 301 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Additional installer parameters') |
||
| 302 | ->setHandlerMethod('handleAdd') |
||
| 303 | ->end() |
||
| 304 | |||
| 305 | ->beginOptionCommand('delete', 'd') |
||
| 306 | ->addArgument('name', Argument::REQUIRED, 'The name of the installer to remove') |
||
| 307 | ->setHandlerMethod('handleDelete') |
||
| 308 | ->end() |
||
| 309 | ->end() |
||
| 310 | ; |
||
| 311 | |||
| 312 | $this |
||
| 313 | ->beginCommand('ls') |
||
| 314 | ->setDescription('List the children of a resource in the repository') |
||
| 315 | ->addArgument('path', Argument::OPTIONAL, 'The path of a resource', '/') |
||
| 316 | ->addOption('long', 'l', Option::NO_VALUE, 'Print more information about each child') |
||
| 317 | ->setHandler(function () use ($puli) { |
||
| 318 | return new LsCommandHandler( |
||
| 319 | $puli->getRepository() |
||
| 320 | ); |
||
| 321 | }) |
||
| 322 | ->end() |
||
| 323 | ; |
||
| 324 | |||
| 325 | $this |
||
| 326 | ->beginCommand('map') |
||
| 327 | ->setDescription('Display and change path mappings') |
||
| 328 | ->setHandler(function () use ($puli) { |
||
| 329 | return new MapCommandHandler( |
||
| 330 | $puli->getRepositoryManager(), |
||
| 331 | $puli->getPackageManager()->getPackages() |
||
| 332 | ); |
||
| 333 | }) |
||
| 334 | |||
| 335 | ->beginOptionCommand('add') |
||
| 336 | ->markAnonymous() |
||
| 337 | ->addArgument('path', Argument::REQUIRED) |
||
| 338 | ->addArgument('file', Argument::REQUIRED | Argument::MULTI_VALUED) |
||
| 339 | ->addOption('force', 'f', Option::NO_VALUE, 'Map even if the target path does not exist') |
||
| 340 | ->setHandlerMethod('handleAdd') |
||
| 341 | ->end() |
||
| 342 | |||
| 343 | ->beginOptionCommand('list') |
||
| 344 | ->markDefault() |
||
| 345 | ->addOption('root', null, Option::NO_VALUE, 'Show mappings of the root package') |
||
| 346 | ->addOption('package', 'p', Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Show mappings of a package', null, 'package') |
||
| 347 | ->addOption('all', 'a', Option::NO_VALUE, 'Show mappings of all packages') |
||
| 348 | ->addOption('enabled', null, Option::NO_VALUE, 'Show enabled mappings') |
||
| 349 | ->addOption('not-found', null, Option::NO_VALUE, 'Show mappings whose referenced paths do not exist') |
||
| 350 | ->addOption('conflict', null, Option::NO_VALUE, 'Show conflicting mappings') |
||
| 351 | ->setHandlerMethod('handleList') |
||
| 352 | ->end() |
||
| 353 | |||
| 354 | ->beginOptionCommand('update', 'u') |
||
| 355 | ->addArgument('path', Argument::REQUIRED) |
||
| 356 | ->addOption('add', 'a', Option::REQUIRED_VALUE | Option::MULTI_VALUED | Option::PREFER_LONG_NAME, 'Add a file to the path mapping', null, 'file') |
||
| 357 | ->addOption('remove', 'r', Option::REQUIRED_VALUE | Option::MULTI_VALUED | Option::PREFER_LONG_NAME, 'Remove a file from the path mapping', null, 'file') |
||
| 358 | ->addOption('force', 'f', Option::NO_VALUE, 'Map even if the target path does not exist') |
||
| 359 | ->setHandlerMethod('handleUpdate') |
||
| 360 | ->end() |
||
| 361 | |||
| 362 | ->beginOptionCommand('delete', 'd') |
||
| 363 | ->addArgument('path', Argument::REQUIRED) |
||
| 364 | ->addArgument('file', Argument::OPTIONAL) |
||
| 365 | ->setHandlerMethod('handleDelete') |
||
| 366 | ->end() |
||
| 367 | ->end() |
||
| 368 | ; |
||
| 369 | |||
| 370 | $this |
||
| 371 | ->beginCommand('package') |
||
| 372 | ->setDescription('Display the installed packages') |
||
| 373 | ->setHandler(function () use ($puli) { |
||
| 374 | return new PackageCommandHandler($puli->getPackageManager()); |
||
| 375 | }) |
||
| 376 | |||
| 377 | ->beginOptionCommand('install', 'i') |
||
| 378 | ->addArgument('path', Argument::REQUIRED, 'The path to the package') |
||
| 379 | ->addArgument('name', Argument::OPTIONAL, 'The name of the package. Taken from puli.json if not passed.') |
||
| 380 | ->addOption('installer', null, Option::REQUIRED_VALUE, 'The name of the installer', InstallInfo::DEFAULT_INSTALLER_NAME) |
||
| 381 | ->addOption('dev', null, Option::NO_VALUE, 'Install the package in the development environment') |
||
| 382 | ->setHandlerMethod('handleInstall') |
||
| 383 | ->end() |
||
| 384 | |||
| 385 | ->beginOptionCommand('list') |
||
| 386 | ->markDefault() |
||
| 387 | ->addOption('installer', null, Option::REQUIRED_VALUE, 'Show packages installed by a specific installer') |
||
| 388 | ->addOption('enabled', null, Option::NO_VALUE, 'Show enabled packages') |
||
| 389 | ->addOption('not-found', null, Option::NO_VALUE, 'Show packages that could not be found') |
||
| 390 | ->addOption('not-loadable', null, Option::NO_VALUE, 'Show packages that could not be loaded') |
||
| 391 | ->addOption('dev', null, Option::NO_VALUE, 'Show packages of the development environment') |
||
| 392 | ->addOption('prod', null, Option::NO_VALUE, 'Show packages of the production environment') |
||
| 393 | ->addOption('format', null, Option::REQUIRED_VALUE, 'The format of the output. You can use the variables %name%, %install_path%, %installer% and %state% in the format string', null, 'format') |
||
| 394 | ->setHandlerMethod('handleList') |
||
| 395 | ->end() |
||
| 396 | |||
| 397 | ->beginOptionCommand('rename') |
||
| 398 | ->addArgument('name', Argument::REQUIRED, 'The name of the package') |
||
| 399 | ->addArgument('new-name', Argument::REQUIRED, 'The new name of the package') |
||
| 400 | ->setHandlerMethod('handleRename') |
||
| 401 | ->end() |
||
| 402 | |||
| 403 | ->beginOptionCommand('delete', 'd') |
||
| 404 | ->addArgument('name', Argument::REQUIRED, 'The name of the package') |
||
| 405 | ->setHandlerMethod('handleDelete') |
||
| 406 | ->end() |
||
| 407 | |||
| 408 | ->beginOptionCommand('clean') |
||
| 409 | ->setHandlerMethod('handleClean') |
||
| 410 | ->end() |
||
| 411 | ->end() |
||
| 412 | ; |
||
| 413 | |||
| 414 | $this |
||
| 415 | ->beginCommand('plugin') |
||
| 416 | ->setDescription('Manage the installed Puli plugins') |
||
| 417 | ->setHandler(function () use ($puli) { |
||
| 418 | return new PluginCommandHandler($puli->getRootPackageFileManager()); |
||
| 419 | }) |
||
| 420 | |||
| 421 | ->beginOptionCommand('install', 'i') |
||
| 422 | ->addArgument('class', Argument::REQUIRED, 'The fully-qualified plugin class name') |
||
| 423 | ->setHandlerMethod('handleInstall') |
||
| 424 | ->end() |
||
| 425 | |||
| 426 | ->beginOptionCommand('list') |
||
| 427 | ->markDefault() |
||
| 428 | ->setHandlerMethod('handleList') |
||
| 429 | ->end() |
||
| 430 | |||
| 431 | ->beginOptionCommand('delete', 'd') |
||
| 432 | ->addArgument('class', Argument::REQUIRED, 'The fully-qualified plugin class name') |
||
| 433 | ->setHandlerMethod('handleDelete') |
||
| 434 | ->end() |
||
| 435 | ->end() |
||
| 436 | ; |
||
| 437 | |||
| 438 | $this |
||
| 439 | ->beginCommand('publish') |
||
| 440 | ->setDescription('Manage public resources') |
||
| 441 | ->setHandler(function () use ($puli) { |
||
| 442 | return new PublishCommandHandler( |
||
| 443 | $puli->getAssetManager(), |
||
| 444 | $puli->getInstallationManager(), |
||
| 445 | $puli->getServerManager() |
||
| 446 | ); |
||
| 447 | }) |
||
| 448 | |||
| 449 | ->beginOptionCommand('add') |
||
| 450 | ->markAnonymous() |
||
| 451 | ->addArgument('path', Argument::REQUIRED, 'The resource path') |
||
| 452 | ->addArgument('server', Argument::REQUIRED, 'The resource path') |
||
| 453 | ->addArgument('server-path', Argument::OPTIONAL, 'The path in the document root of the server', '/') |
||
| 454 | ->addOption('force', 'f', Option::NO_VALUE, 'Map even if the server does not exist') |
||
| 455 | ->setHandlerMethod('handleAdd') |
||
| 456 | ->end() |
||
| 457 | |||
| 458 | ->beginOptionCommand('update', 'u') |
||
| 459 | ->addArgument('uuid', Argument::REQUIRED, 'The UUID (prefix) of the mapping') |
||
| 460 | ->addOption('path', null, Option::REQUIRED_VALUE, 'The resource path') |
||
| 461 | ->addOption('server', 's', Option::REQUIRED_VALUE | Option::PREFER_LONG_NAME, 'The name of the target server') |
||
| 462 | ->addOption('server-path', null, Option::REQUIRED_VALUE, 'The path in the document root') |
||
| 463 | ->addOption('force', 'f', Option::NO_VALUE, 'Update even if the server does not exist') |
||
| 464 | ->setHandlerMethod('handleUpdate') |
||
| 465 | ->end() |
||
| 466 | |||
| 467 | ->beginOptionCommand('delete', 'd') |
||
| 468 | ->addArgument('uuid', Argument::REQUIRED, 'The UUID (prefix) of the mapping') |
||
| 469 | ->setHandlerMethod('handleDelete') |
||
| 470 | ->end() |
||
| 471 | |||
| 472 | ->beginOptionCommand('list', 'l') |
||
| 473 | ->markDefault() |
||
| 474 | ->setHandlerMethod('handleList') |
||
| 475 | ->end() |
||
| 476 | |||
| 477 | ->beginOptionCommand('install') |
||
| 478 | ->addArgument('server', Argument::OPTIONAL, 'The server to install. By default, all servers are installed') |
||
| 479 | ->setHandlerMethod('handleInstall') |
||
| 480 | ->end() |
||
| 481 | ->end() |
||
| 482 | ; |
||
| 483 | |||
| 484 | $this |
||
| 485 | ->beginCommand('self-update') |
||
| 486 | ->setDescription('Update Puli to the latest version.') |
||
| 487 | ->addOption('stable', null, Option::NO_VALUE, 'Update to the latest stable version') |
||
| 488 | ->addOption('unstable', null, Option::NO_VALUE, 'Update to the latest unstable version') |
||
| 489 | ->setHandler(function () { |
||
| 490 | return new SelfUpdateCommandHandler(); |
||
| 491 | }) |
||
| 492 | ->enableIf('phar://' === substr(__DIR__, 0, 7) && version_compare(PHP_VERSION, '5.6', '>=')) |
||
| 493 | ->end() |
||
| 494 | ; |
||
| 495 | |||
| 496 | $this |
||
| 497 | ->beginCommand('server') |
||
| 498 | ->setDescription('Manage your asset servers') |
||
| 499 | ->setHandler(function () use ($puli) { |
||
| 500 | return new ServerCommandHandler($puli->getServerManager()); |
||
| 501 | }) |
||
| 502 | |||
| 503 | ->beginOptionCommand('list') |
||
| 504 | ->markDefault() |
||
| 505 | ->setHandlerMethod('handleList') |
||
| 506 | ->end() |
||
| 507 | |||
| 508 | ->beginOptionCommand('add', 'a') |
||
| 509 | ->addArgument('name', Argument::REQUIRED, 'The name of the added server') |
||
| 510 | ->addArgument('document-root', Argument::REQUIRED, 'The document root of the server') |
||
| 511 | ->addOption('installer', null, Option::REQUIRED_VALUE, 'The name of the used installer', 'symlink') |
||
| 512 | ->addOption('url-format', null, Option::REQUIRED_VALUE, 'The format of the generated resource URLs', Server::DEFAULT_URL_FORMAT) |
||
| 513 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Additional parameters required by the resource installer') |
||
| 514 | ->setHandlerMethod('handleAdd') |
||
| 515 | ->end() |
||
| 516 | |||
| 517 | ->beginOptionCommand('update', 'u') |
||
| 518 | ->addArgument('name', Argument::REQUIRED, 'The name of the updated server') |
||
| 519 | ->addOption('document-root', null, Option::REQUIRED_VALUE, 'The document root of the server') |
||
| 520 | ->addOption('installer', null, Option::REQUIRED_VALUE, 'The name of the used installer', 'symlink') |
||
| 521 | ->addOption('url-format', null, Option::REQUIRED_VALUE, 'The format of the generated resource URLs', Server::DEFAULT_URL_FORMAT) |
||
| 522 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Additional parameters required by the resource installer') |
||
| 523 | ->addOption('unset-param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Parameters to remove from the server') |
||
| 524 | ->setHandlerMethod('handleUpdate') |
||
| 525 | ->end() |
||
| 526 | |||
| 527 | ->beginOptionCommand('delete', 'd') |
||
| 528 | ->addArgument('name', Argument::REQUIRED, 'The name of the server to remove') |
||
| 529 | ->setHandlerMethod('handleDelete') |
||
| 530 | ->end() |
||
| 531 | ->end() |
||
| 532 | ; |
||
| 533 | |||
| 534 | $this |
||
| 535 | ->beginCommand('tree') |
||
| 536 | ->setDescription('Print the contents of a resource as tree') |
||
| 537 | ->addArgument('path', Argument::OPTIONAL, 'The path of a resource', '/') |
||
| 538 | ->setHandler(function () use ($puli) { |
||
| 539 | return new TreeCommandHandler($puli->getRepository()); |
||
| 540 | }) |
||
| 541 | ->end() |
||
| 542 | ; |
||
| 543 | |||
| 544 | $this |
||
| 545 | ->beginCommand('type') |
||
| 546 | ->setDescription('Display and change binding types') |
||
| 547 | ->setHandler(function () use ($puli) { |
||
| 548 | return new TypeCommandHandler( |
||
| 549 | $puli->getDiscoveryManager(), |
||
| 550 | $puli->getPackageManager()->getPackages() |
||
| 551 | ); |
||
| 552 | }) |
||
| 553 | |||
| 554 | ->beginOptionCommand('define') |
||
| 555 | ->addArgument('name', Argument::REQUIRED, 'The name of the binding type') |
||
| 556 | ->addOption('description', null, Option::REQUIRED_VALUE, 'A human-readable description of the type') |
||
| 557 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A type parameter in the form <key> or <key>=<value>', null, 'key=value') |
||
| 558 | ->addOption('param-description', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A human-readable parameter description in the form <key>=<description>', null, 'key=description') |
||
| 559 | ->addOption('force', 'f', Option::NO_VALUE, 'Add type even if another type exists with the same name') |
||
| 560 | ->setHandlerMethod('handleDefine') |
||
| 561 | ->end() |
||
| 562 | |||
| 563 | ->beginSubCommand('list') |
||
| 564 | ->markDefault() |
||
| 565 | ->addOption('root', null, Option::NO_VALUE, 'Show types of the root package') |
||
| 566 | ->addOption('package', 'p', Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Show types of a package', null, 'package') |
||
| 567 | ->addOption('all', 'a', Option::NO_VALUE, 'Show types of all packages') |
||
| 568 | ->addOption('enabled', null, Option::NO_VALUE, 'Show enabled types') |
||
| 569 | ->addOption('duplicate', null, Option::NO_VALUE, 'Show duplicate types') |
||
| 570 | ->setHandlerMethod('handleList') |
||
| 571 | ->end() |
||
| 572 | |||
| 573 | ->beginOptionCommand('update', 'u') |
||
| 574 | ->addArgument('name', Argument::REQUIRED, 'The name of the binding type') |
||
| 575 | ->addOption('description', null, Option::REQUIRED_VALUE, 'A human-readable description of the type') |
||
| 576 | ->addOption('param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A type parameter in the form <key> or <key>=<value>', null, 'key=value') |
||
| 577 | ->addOption('param-description', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'A human-readable parameter description in the form <key>=<description>', null, 'key=description') |
||
| 578 | ->addOption('unset-param', null, Option::REQUIRED_VALUE | Option::MULTI_VALUED, 'Unset a type parameter', null, 'key') |
||
| 579 | ->setHandlerMethod('handleUpdate') |
||
| 580 | ->end() |
||
| 581 | |||
| 582 | ->beginOptionCommand('delete', 'd') |
||
| 583 | ->addArgument('name', Argument::REQUIRED, 'The name of the binding type') |
||
| 584 | ->setHandlerMethod('handleDelete') |
||
| 585 | ->end() |
||
| 586 | ->end() |
||
| 587 | ; |
||
| 588 | |||
| 589 | $this |
||
| 590 | ->beginCommand('upgrade') |
||
| 591 | ->setDescription('Upgrades puli.json to the newest version') |
||
| 592 | ->addArgument('version', Argument::OPTIONAL, 'The version to upgrade/downgrade to', PackageFile::DEFAULT_VERSION) |
||
| 593 | ->setHandler(function () use ($puli) { |
||
| 594 | return new UpgradeCommandHandler($puli->getRootPackageFileManager()); |
||
| 595 | }) |
||
| 596 | ->end() |
||
| 597 | ; |
||
| 598 | |||
| 599 | $this |
||
| 600 | ->beginCommand('url') |
||
| 601 | ->setDescription('Generate the URL of a public resource') |
||
| 602 | ->addArgument('path', Argument::REQUIRED | Argument::MULTI_VALUED, 'The path of a resource') |
||
| 603 | ->setHandler(function () use ($puli) { |
||
| 604 | return new UrlCommandHandler( |
||
| 605 | $puli->getUrlGenerator(), |
||
| 606 | $puli->getRepository() |
||
| 607 | ); |
||
| 608 | }) |
||
| 609 | ->end() |
||
| 610 | ; |
||
| 611 | } |
||
| 612 | } |
||
| 613 |
This error could be the result of:
1. Missing dependencies
PHP Analyzer uses your
composer.jsonfile (if available) to determine the dependencies of your project and to determine all the available classes and functions. It expects thecomposer.jsonto be in the root folder of your repository.Are you sure this class is defined by one of your dependencies, or did you maybe not list a dependency in either the
requireorrequire-devsection?2. Missing use statement
PHP does not complain about undefined classes in
ìnstanceofchecks. For example, the following PHP code will work perfectly fine:If you have not tested against this specific condition, such errors might go unnoticed.