如何在可在全局和工作空间内运行的终端中创建快捷方式命令

时间:2019-04-13 14:38:07

标签: php command-line-interface

我需要创建一个别名,该别名将为使用我正在开发的开源项目的php开发人员提供php app (arguments...)的快捷方式。就像使用下面的命令在全局创建一个新应用一样;

创建新应用

app init socialApp

或在socialApp项目内进行数据库迁移

app migrate --silent

其中 app 是别名或排序。

我的研究将我引向本文https://codeburst.io/how-to-create-shortcut-commands-in-the-terminal-for-your-mac-9e016e25e4d7,但确实与MacOs用户紧密相关,并且无法弄清楚如果在工作区中运行了命令,我该如何为新项目服务或执行操作。

很高兴能有一个开端。

1 个答案:

答案 0 :(得分:0)

花费了一段时间,但我终于找到了解决方案。由于我的框架可以公开下载和使用。我决定回到这个问题并找到解决方法。

这是我采取的步骤。 (在MAC OS上使用PHP)

  1. 创建一个包含可执行文件的文件夹。我的名字叫( moorexa ),没有扩展名。
  2. 将路径添加到〜/ .bash_profile (为了演示,我的文件夹将在Applications目录中创建)
  3. 打开您的终端并运行nano ~/.bash_profile
  4. 添加路径。我的是export PATH=$PATH:/Applications/moorexa。现在,moorexa是文件夹的名称,我在其中的唯一文件也称为moorexa。这样我就可以从终端呼叫moorexa startmoorexa compile
  5. 使用CMD + X关闭文件,然后输入Y保存。
  6. 运行source ~/.bash_profile更新当前终端的会话。

我们几乎已经解决了这个问题。最后一件事就是要了解您是否正在从自己确定的项目中运行此命令。对于我来说,如果我要在moorexa项目中执行请求,我想把责任推给默认安装的moorexa随附的协助管理器。

好吧,看一下架构,框架有一个初始化文件,所以这也是您可以做的。

#!/usr/bin/env php
<?php

// get the working directory
define('WORKING_DIRECTORY', $_SERVER['PWD'] . '/');

// get the arguments
$argv = $_SERVER['argv'];

// check for init within current directory
$initFile = WORKING_DIRECTORY . 'init.php';

// message to screen
function screen_display($message, string $type = '')
{
    // reset color
    $reset = "\033[0m";

    // get type
    $color = $type == 'error' ? "\033[31m" : ($type == 'success' ? "\033[32m" : '');

    // print message
    fwrite(STDOUT,  $color . $message . $reset . "\n");
}


// check if init file exists
if (file_exists($initFile)) :

    // change working directory
    chdir(WORKING_DIRECTORY);

    // require the assist file
    return (file_exists('assist') ? include_once 'assist' : null);
    
endif;

// command string 
$commands = "
Try any of this commands:\n
(1.) moorexa create 
(2.) moorexa update 
(3.) moorexa create <project-name>
(4.) moorexa create <project-name> -service
(5.) moorexa create <project-name> -frontend
(6.) moorexa prepare

For more information, please visit www.moorexa.com";


// not within a working project
if (count($argv) == 1 || (isset($argv[1]) && strlen(trim($argv[1])) == 0)) return screen_display("
Not within a working moorexa directory\n
{$commands}
");


// manage request
switch(strtolower($argv[1])) :

    // create command
    case 'create':

        // get the folder name
        $folderName = isset($argv[2]) ? $argv[2] : '';

        // check for '-'
        if (strpos($folderName, '-') !== false) :

            // push to next argv
            $argv[3] = $folderName;

            // replace name
            $folderName = '';

        endif;

        // get directory
        $directory = rtrim(WORKING_DIRECTORY . $folderName, '/') . '/';

        // stop if directory exists
        if ($folderName != '' && is_dir($directory)) return screen_display('Workspace exists. Failed to overwrite', 'error');

        // create folder if it doesn't exists
        if (!is_dir($directory)) mkdir($directory);

        // get the create type
        $createType = isset($argv[3]) ? strtolower($argv[3]) : 'frontend';

        // remove dash
        $createType = ltrim($createType, '-');

        // open storage
        $storage = __DIR__ . '/storage/' . ($createType == 'service' ? 'backend' : $createType) . '.zip';

        // does file exists
        if (!file_exists($storage)) return implode("\n", [
            screen_display('Invalid create type "'.$createType.'"', 'error'),
            screen_display($commands)
        ]);

        // file exists
        // open zip manager
        screen_display('Creating a blank project for "'.$createType.'"', 'success');

        // get size
        $fileSize = filesize($storage);

        // print size to screen
        screen_display('Pouring size ' . round($fileSize / 1024) . 'kb into '.$directory.'');

        // load zip archive
        $zipArchive = new ZipArchive();

        // open file
        if (!$zipArchive->open($storage)) return screen_display('Could not start extracting. It\'s possible that the .zip file has been corrupted or we dont have full permission to continue. Please run moorexa update or contact support.', 'error');

        // starting extraction
        screen_display('Starting extraction from cache', 'success');

        // sleep
        sleep(2);

        // start now
        if ($zipArchive->extractTo($directory)) $zipArchive->close();

        // all good
        screen_display('Your project has been created successfully.', 'success');

        // change directory
        $changeDirectory = $directory == WORKING_DIRECTORY ? 'run ' : 'cd into "'.$directory.'", and run ';

        // final note
        screen_display("\n".'So what next?'."\n". $changeDirectory .' "moorexa install" to load required dependencies, or "moorexa serve" to start development server if dependencies already exists.'."\n\n".'Thank you for building with Moorexa..');

    break;

    // prepare
    case 'prepare':

        // check for folder installation
        if (!is_dir(__DIR__ . '/storage')) mkdir(__DIR__ . '/storage');
        
        // try to download from svn.

    break;

    // invalid command 
    default:
        screen_display('Invalid command "'.$argv[1].'"', 'error');
        screen_display($commands);
endswitch;

这有效。仍在实现更多功能,我希望创建一个安装程序来注册路径并在多个平台上完成此过程。