5

我正在做一个包裹,我真的需要能够开火

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 不是为通过网络调用而设计的吗?有人有什么建议吗?

4

7 回答 7

4

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

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

您还可以让它自动编译 Sass、设置 livereload 等。看看Jeffrey Way 的截屏视频即可开始使用。

于 2013-04-30T19:35:10.540 回答
3

您可以使用带有 shell watch 命令的 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

在诸如 less 或 uglify 等其他 grunt 命令将您的资产编译为公共后,这自然可以工作,从而更改它们并触发发布。

于 2014-04-06T12:28:47.730 回答
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);
        }
    }   
}

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

于 2013-04-10T19:29:12.850 回答
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 发布。

于 2013-08-26T02:09:16.440 回答
0

还有一个选项,您可以添加一个 composer 命令。例如,当使用 install 将项目部署到服务器时:

"post-install-cmd": [
    "php artisan clear-compiled",
    "php artisan optimize",
    "php artisan asset:publish vendor-name/package-name"
],
于 2015-02-10T13:16:38.663 回答
0

顺便说一句 5.1 正确的方式:

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

于 2015-11-06T17:48:47.133 回答
-1

试试直接编辑里面的css和js文件

{app_root}/public/bundles/{bundle}/{css|js}

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

命令::运行(数组('task_name'));

官方文档中有几个例子。

于 2013-04-04T13:05:02.693 回答