2016-06-30 6 views
0

Ich erstelle eine modulare Laravel 5.2 App, die aus einer Reihe von proprietären Paketen besteht, die auf einer Laravel-Installation mit Composer geladen werden.Laravel Elixir Kopie funktioniert nicht auf symbolische Links

Jedes der Pakete ist verantwortlich für die Verwaltung seiner eigenen Assets (in den Öffentlichen Ordner kopieren, komprimieren, versionieren usw.). Um dies zu erreichen, habe ich eine Gulp-Datei, die Elixir für jedes Paket verwendet, und dann werden sie auf die Haupt-Gulp-Datei der Laravel-Installation geladen.

Dies ist die Haupt gulpfile.js auf der Laravel Installation:

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); 
      } 
     } 
    }); 
} 

Alle wichtigen gulpfile.js der Fall ist, ist die Pakete gulpfiles ausführen, wenn sie eine require() Funktion existieren verwenden.

Im Folgenden ist ein Beispiel für ein Paket 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', 
    ]); 
}); 

In einem normalen Fall dies ganz gut funktioniert. Ein Normalfall ist, dass die Pakete mit Composer geladen werden.

Für die Entwicklung der Pakete, ich erstelle jedoch einen symbolischen Link im Herstellerordner, der auf den Paketordner auf meinem lokalen Rechner zeigt.

Wenn ich versuche, schluck in der Entwicklungsumgebung auszuführen, erhalte ich einen Cannot find module 'laravel-elixir' Fehler:

[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 

Problem, das ich global durch die Installation Laravel-Elixier gelöst. Aber nachdem ich das getan habe, endet die Schluckaufgabe und mein Vermögen wird nicht kopiert.

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

Kein Fehler erscheint überhaupt. Hoffe jemand kann mir helfen. Vielen Dank.

+0

sind auf einem Windows-Host Sie Vagrant verwenden? –

+0

@ MarcoAurélioDeleu Nein, ich benutze Homestead auf Mint. – BernalCarlos

Antwort

0

Ich denke, du gehst hier in die falsche Richtung. Dies erfordert ein gewisses Maß an Wissen über die Funktionsweise jedes Pakets, das dem Zweck von Paketmanagern zuwiderläuft.

Stattdessen sollten Sie zulassen, dass alle Assets Ihres Lieferantenpakets veröffentlicht werden.

Sie, indem Sie sicherstellen beginnen werden, dass in Ihrem boot Methode Sie Ihr Vermögen entsprechend veröffentlichen:

$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. 

Dann, wenn

php artisan vendor:publish 

Jetzt alle Ihre JavaScript und CSS geschoben wird Ausführung in es ist der jeweilige Standort in Ihrem resource_path

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

Jetzt müssen Sie nur Ihre Gulp-Task-Uhr verketten und alle Skripte von /my-orginazation/**/js laden. So, jetzt können Sie nur so etwas tun:

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

Do, npm --global Laravel-Elixier installieren, bevor Sie schlucken sagen

+0

Der "Laravel-Elixir" Fehler kann nicht gefunden werden, aber dann wird die Schluckaufgabe beendet und meine Assets werden nicht kopiert. – BernalCarlos