【问题标题】:Laravel elixir copy not working on symbolic linksLaravel 长生不老药副本不适用于符号链接
【发布时间】:2016-06-30 22:37:36
【问题描述】:

我正在创建一个模块化的 Laravel 5.2 应用程序,它包含许多使用 composer 在 Laravel 安装上加载的专有包。

每个包都负责管理自己的资产(复制到公共文件夹、压缩、版本控制等)。为此,我有一个 gulpfile,它为每个包使用 elixir,然后将它们加载到 laravel 安装的主 gulpfile 中。

这是 laravel 安装的主要 gulpfile.js:

var filesystem = require("fs");
var gulp = require('gulp');
var elixir = require('laravel-elixir');

gulp.task('default', function() {
    runPackagesGulpFiles();
});

function runPackagesGulpFiles() {
    var packagesPath = 'vendor/my-organization/';
    filesystem.readdirSync(packagesPath).forEach(function (file){
        try {
            var gulpFilePath = packagesPath + file + '/resources/assets/gulpfile.js';
            var fileStat = filesystem.statSync(gulpFilePath);
            require('./' + gulpFilePath);
        } catch (error) {
            if (error.message.indexOf('no such file or directory') < 0) {
                console.error(error.stack);
            }
        }
    });
}

gulpfile.js 的所有主要功能是使用 require() 函数执行 gulpfile 包(如果它们存在)。

以下是包 gulpfile 的示例:

var elixir = require('laravel-elixir');

elixir(function(mix) {
    mix.copy('vendor/my-organization/store-manager/resources/assets/js/', 'public/assets/js/elixir_components/store-manager/');
    mix.version([
        //Store structure versioning
        'assets/js/elixir_components/store-manager/stores/store.js',
        'assets/js/elixir_components/store-manager/stores/views.js',
        'assets/js/elixir_components/store-manager/stores/models.js',
        'assets/js/elixir_components/store-manager/stores/controllers.js',
        //Store resources versioning
        'assets/js/elixir_components/store-manager/resources/resources.js',
        'assets/js/elixir_components/store-manager/resources/views.js',
        'assets/js/elixir_components/store-manager/resources/models.js',
        'assets/js/elixir_components/store-manager/resources/controllers.js',
        //Store structure resources versioning
        'assets/js/elixir_components/store-manager/structures/structure.js',
        'assets/js/elixir_components/store-manager/structures/views.js',
        'assets/js/elixir_components/store-manager/structures/models.js',
        'assets/js/elixir_components/store-manager/structures/controllers.js',
    ]);
});

在正常情况下,这工作得很好。一个正常的情况是使用 composer 加载包。

但是,为了开发包,我在供应商文件夹中创建了一个符号链接,指向我本地机器中的包文件夹。

当我尝试在开发环境中执行 gulp 时,我得到一个Cannot find module 'laravel-elixir' 错误:

[22:27:03] Using gulpfile ~/supermarket-cms/gulpfile.js
[22:27:03] Starting 'default'...
Error: Cannot find module 'laravel-elixir'
    at Function.Module._resolveFilename (module.js:339:15)
    at Function.Module._load (module.js:290:25)
    at Module.require (module.js:367:17)
    at require (internal/module.js:16:19)
    at Object.<anonymous> (/home/vagrant/Code/store-manager/resources/assets/gulpfile.js:1:76)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Module.require (module.js:367:17)
[22:27:03] Finished 'default' after 12 ms

我通过全局安装 laravel-elixir 解决的问题。但在我这样做之后,gulp 任务结束,我的资产不会被复制。

[21:25:02] Using gulpfile ~/supermarket-cms/gulpfile.js
[21:25:02] Starting 'default'...
[21:25:02] Finished 'default' after 3.78 ms

没有出现任何错误。希望可以有人帮帮我。谢谢。

【问题讨论】:

  • 你在 Windows 主机上使用 Vagrant 吗?
  • @MarcoAurélioDeleu 不,我在 Mint 上使用 Homestead。

标签: laravel laravel-5 npm gulp laravel-elixir


【解决方案1】:

我认为你的做法是错误的。这需要对每个 vendor 包的工作原理有一定程度的了解,这与包管理器的目的背道而驰。

相反,您应该允许发布供应商包中的所有资产。

您首先要确保在您的 boot 方法中相应地发布您的资产:

$this->publishes([
    __DIR__.'/path/to/assets' => resource_path('vendor/my-organization/'.$package_name),
], 'public');

//make sure to replace '/path/to/assets' with your packages asset path.

那么当执行时

php artisan vendor:publish

现在您所有的 JavaScript 和 CSS 都将被推送到您 resource_path 中的相应位置

resources/
    vendor/
        my-organization/
            <package_name>
                js/

现在只需让您的 Gulp 任务监视连接并从 /my-orginazation/**/js 中加载所有脚本。所以现在你可以这样做:

elixir(function(mix){
    'vendor/my-organization/**/js/*.js',
}, 'public/js/outputfile.js, 'resources');

【讨论】:

    【解决方案2】:

    在你说 gulp 之前做 npm install --global laravel-elixir

    【讨论】:

    • 已经这样做了,cannot find module 'laravel-elixir' 错误消失了,但是 gulp 任务结束并且我的资产没有被复制。
    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 2017-01-03
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多