作曲家脚本部分os.dependent

时间:2016-08-11 11:57:41

标签: windows shell composer-php

是否可以检查当前的操作系统? 以下cmd在Windows上失败,因为chmod不存在

{ ...
  "scripts": {
    "post-update-cmd": "chmod -R 777 ../log"
  }
}

有解决方法吗? 亲切的问候,罗伯特

3 个答案:

答案 0 :(得分:3)

我认为最简单的解决方案是使用PHP本身:

{ ...
  "scripts": {
    "post-update-cmd": "php -r chmod('../log', 0777);"
  }
}

这需要php二进制文件在Linux / OSX / Windows上的PATH(或类似文件)中。

  Ps:我无法回想起,但我相信道路应该是相对的   你的composer.json所在的位置,所以你可能需要调整上面的内容   相应的路径。

答案 1 :(得分:1)

可能的解决方案是将post update命令移动到钩子中并对那里的操作系统执行所有必要的检查。 在你的作曲家:

{ ...
  "scripts": {
    "post-update-cmd": "Hooks\MyHook::checkOS()"
  },
 "autoload": {
    "psr-0": {
        "Hooks": "src/"
    }
 }

}

创建将处理逻辑的类:

...
class MyHook(){

 public static function checkOS(){
  // 1 - get operating system
  // 2 - is chmod exist? execute chmod -R 777 ../log
}

}

答案 2 :(得分:1)

感谢@alcohol指出我正确的方向。 简单的解决方案:

"scripts": {
  "post-update-cmd": "php post-update-cmd.php"
}

后更新cmd.php:

#!/bin/php
<?php

ini_set('register_argc_argv', 0);
if (!isset($argc) || is_null($argc)) die('CLI only');

$log_dir = dirname(dirname(__FILE__)). DIRECTORY_SEPARATOR . 'log';

if( strpos(strtolower(php_uname('s')), 'win') === false ) {
    exec("mkdir -p $log_dir && chmod -R 777 $log_dir");
} else { // Windows !
    if( !file_exists($log_dir) ) {
        exec("mkdir $log_dir");
    }
    echo "WinOS - no chmod available\n";
}

echo "Finished\n";