我正在创建一个模块化的Laravel 5.2应用程序,它由使用composer在Laravel安装中加载的许多专有软件包组成。
每个软件包都负责管理自己的资产(复制到公用文件夹,压缩,版本控制等)。为了实现这一点,我有一个gulpfile,它为每个包使用elixir,然后,它们被加载到laravel安装的主gulp文件中。
这是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()
函数执行包gulpfiles。
以下是包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加载包。
但是,为了开发包,我在vendor文件夹中创建了一个符号链接,指向本地计算机中的包文件夹。
当我尝试在开发环境中执行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
不会出现任何错误。希望可以有人帮帮我。谢谢。
答案 0 :(得分:0)
我认为你这是错误的做法。这需要对每个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');
答案 1 :(得分:0)
在你说gulp
之前,npm install --global laravel-elixir