在Laravel 4的开发过程中自动调用asset:publish --bench =“vendor / package”

时间:2013-02-01 10:06:35

标签: laravel laravel-4

我正在开发一个包,我真的需要能够解雇

php artisan asset:publish --bench="vendor/package"

在开发过程中自动执行命令。

每次我更改我的包中的JavaScript或CSS文件时,编写该命令都非常耗时。

我试图在我的服务提供商中致电Artisan

public function boot()
{       
    Artisan::call('asset:publish', array('--bench' => 'arni-gudjonsson/webber'));
    ...
}

我得到了

ErrorException: Runtime Notice: Non-static method Illuminate\Foundation\Artisan::call() should not be called statically, assuming $this from incompatible context

Artisan是不是设计为通过网络调用?有人有什么建议吗?

7 个答案:

答案 0 :(得分:4)

您可以使用Guard执行此类任务。例如,以下是我的Guardfile中的一部分,用于在更改包时自动发布包:

guard :shell do
    watch(%r{^workbench/vendor/package/public/.+\..+$}) {
        `php artisan asset:publish --bench="vendor/package"`
    }
end

你也可以让它自动编译Sass,设置livereload等。看看Jeffrey Way's screencast开始。

答案 1 :(得分:3)

您可以使用带有shell监视命令的Grunt来实现此目的,例如:

$ npm install grunt-shell

在vendor / yourname / yourpackage / Gruntfile.js中:

    shell: {                           
        assets: {                      
            options: {                 
                stdout: true
            },
            command: 'cd ../../..; php artisan asset:publish yourname/yourpackage'
        },
        views: {                      
            options: {                
                stdout: true
            },
            command: 'cd ../../..; php artisan view:publish yourname/yourpackage;'
        }
    },
    watch: {
        assets: {
            files: ['./public/**/*.js', './public/**/*.css'],
            tasks: ['shell:assets']
        },
        views: {
            files: ['./src/views/**/*.php', './src/views/**/*.md'],
            tasks: ['shell:views']                          
        }
    }

...

grunt.loadNpmTasks('grunt-shell');
grunt.loadNpmTasks('grunt-contrib-watch');

grunt.registerTask('default', ['watch']);

然后开始观看:

$ grunt watch

在其他grunt命令(例如less或uglify)将您的资产编译为公共资源,从而更改它们并触发发布后,这自然会起作用。

答案 2 :(得分:0)

这就是我正在做的事情:

<?php namespace Vendor\Package;

use \App;
use Illuminate\Filesystem\Filesystem;

class DecoyServiceProvider extends ServiceProvider {
    public function boot() {
        $this->package('bkwld/decoy');

        // Auto-publish the assets when developing locally
        if (App::environment() == 'local' && !App::runningInConsole()) {
            $workbench = realpath(base_path().'/workbench');
            if (strpos(__FILE__, $workbench) === false) App::make('asset.publisher')->publishPackage('vendor/package');
            else App::make('asset.publisher')->publishPackage('vendor/package', $workbench);
        }
    }   
}

只要请求来自本地环境,就会自动发布资产,无论捆绑包是否在工作台中。

答案 3 :(得分:0)

编辑/workbench/yourappspace/yourapp/AppServiceProvider.php

<?php namespace YourAppSpace\YourApp;

use Illuminate\Support\ServiceProvider;
use Artisan;

在boot()方法中,

public function boot()
{
$this->package('yourappspace/yourapp');
$app = $this->app;
include __DIR__.'/../../routes.php';

Artisan::call('asset:publish', array('--bench' => 'yourappspace/yourapp'));
}

现在每次更新代码并刷新浏览器时,您的资产都会以Artisan发布。

答案 4 :(得分:0)

还有另一个选项,即添加composer命令。例如,使用install:

将项目部署到服务器时
"post-install-cmd": [
    "php artisan clear-compiled",
    "php artisan optimize",
    "php artisan asset:publish vendor-name/package-name"
],

答案 5 :(得分:0)

BTW 5.1正确方式:

\Artisan::call('vendor:publish', [ '--tag' => ['public'], '--provider' => 'Some\Your\ServiceProvider', '--force' => true ]);

答案 6 :(得分:-1)

尝试直接编辑

中的css和js文件
  

{APP_ROOT} /公共/捆绑/ {束} / {CSS | JS}

目录,完成后,只需将修改后的文件复制回bundle的公共目录即可。这可能是错误的方法,但嘿,它的工作原理。另一种选择是创建任务并运行

  

命令::运行(阵列( 'TASK_NAME'));

官方文档中有一些示例。