ScarShow

< IS >

NanoCLI - PHP CLI 開發工具 (1)

關於NanoCLI這個工具原本想都沒有想過要去製作它,它是伴隨著Pointless一起誕生出來的,除了NanoCLI之外還有一個CSS Compressor這個小工具但這邊先不說。

約一年前,那時候為了想要讓Pointless看起來像是使用內建指令那樣去操作,所以就另外製作了NanoCLI讓Pointless能順利實作各種CLI的指令,到現在NanoCLI只有少少的3個檔案而且總程式不超過250行,使用上也很簡單。

系統要求

PHP 5.3+

功能

  • 指令呼叫 (ex. $ ./cli.php command)
  • 指令選項 (ex. $ ./cli.php command -v -al)
  • 指令配置 (ex. $ ./cli.php command --prefix=/usr/local/bin)
  • 文字色彩
  • 文字界面讀寫
  • Namespace 以及 Autoload

使用

下載原始碼

git clone git://github.com/scarwu/NanoCLI.git

檔案配置

.
├── boot.php
├── Command
│   ├── Test
│   │   ├── Help.php
│   │   └── Read.php
│   └── Test.php
└── NanoCLI
    ├── Command.php
    ├── IO.php
    └── Loader.php

設定Boot

做為一個CLI應用程式首先要設定程式的進入點。

<?php
/* Boot.php */

// 載入 Loader
require realpath(__DIR__ . '/../src/NanoCLI/Loader.php');

use NanoCLI\Loader;

// 設定程式目錄以及Namespace
// 先設定NanoCLI的位置
Loader::register('NanoCLI', realpath(__DIR__ . '/../src'));
// 再設定相關指令的位置
Loader::register('Test', realpath(__DIR__ . '/Command'));

// 註冊autoload function
spl_autoload_register('NanoCLI\Loader::load');

// 初始化指令
$test = new Test();
$test->Init();

實作指令 Test.php

上面的程式碼最後初始化了Test這個Class,再初始化之後NanoCLI會自動呼叫對應指令,所以在這邊我們顯來實作第一個指令。

<?php
use NanoCLI\IO;

// 繼承 NanoCLI\Command
class Test extends NanoCLI\Command {

    public function __construct() {
        // 呼叫Parent Construct
        parent::__construct();
    }

    public function run() {
        // 讀取鍵盤輸入
        IO::write('Enter your name: ');
        $name = IO::read();

        // 輸出結果
        IO::writeln('Hi, ' . $name, 'green');
    }
}


每個指令都要繼承NanoCLI\Command,然後記得要叫Parent Construct,這樣程式才會動,所以現在可以執行第一個程式了,應該會有以下的結果。

php boot.php
Enter your name: Scar
Hi, Scar


雖然在呼叫的時候沒有帶入任何參數但它也是一個指令,它就像是一般程式的main一樣的作用,所以可以將上面範例程式的run()改成自動呼叫help指令以防止使用者不知道要如何去使用你的程式。

<?php
use NanoCLI\IO;

// 繼承 NanoCLI\Command
class Test extends NanoCLI\Command {

    public function __construct() {
        // 呼叫Parent Construct
        parent::__construct();
    }

    public function run() {
        // 呼叫Help指令
        $help = new Test\Help();
        $help->run();
    }
}

待續...