jamesknelson / gulp-rev-replace

Rewrite occurences of filenames which have been renamed by gulp-rev
MIT License
389 stars 62 forks source link

Html Output Doesn't Contain Replaced Names If Using $.rev.manifest() #70

Closed mtpultz closed 7 years ago

mtpultz commented 7 years ago

Using rev-replace with rev.manifest seems to prevent replacement of the revisioned files.

gulp.task('build', [
    'sass',
    'inject-loader',
    'inject-scripts',
    'inject-templates',
    'inject-library-scripts',
    'inject-library-styles'
], function () {

    helpers.log('Build Application');

    var masterFile = path.join(config.viewPath, config.master);
    var assets = $.useref({
        searchPath: ['public']
    });

    var publicBuildFolder = path.join(config.publicPath, '/build');
    var viewBuildFolder = path.join(config.viewPath, '/build');

    // Clean out the previous build
    helpers.clean([
        path.join(publicBuildFolder, '**/*'),
        path.join(viewBuildFolder, '**/*')
    ]);

    var filterAssets = $.filter([
        '**/app.js',
        '**/lib.css',
        '!**/master.blade.php'
    ], {restore: true});

    var filterHtml = $.filter([
        '**/master.blade.php'
    ], {restore: true});

    // Process and replace with new build
    // Process and replace with new build
    return gulp.src(masterFile)
               .pipe(assets)
               .pipe($.plumber())

               .pipe(filterAssets)
               .pipe($.rev())
               .pipe(gulp.dest(config.publicPath))
               // .pipe($.rev.manifest())
               // .pipe(gulp.dest(publicBuildFolder))
               .pipe(filterAssets.restore)

               .pipe(args.verbose ? $.print() : $.util.noop())

               .pipe($.revReplace({
                   replaceInExtensions: ['.php']
               }))
               // .pipe($.revReplace({
               //     replaceInExtensions: ['.php'],
               //     manifest: gulp.src(publicBuildFolder + 'rev-manifest.json')
               // }))

               .pipe(filterHtml)

               .pipe(gulp.dest(viewBuildFolder));
});

Original template in /views/master.blade.php

<!-- Vendor Scripts -->
<!-- build:js /build/js/app.js -->

<!-- removed scripts for brevity -->

<!-- endbuild -->

Output in /views/build/master.blade.php

<script src="/build/js/app.js"></script>

Should be:

<script src="/build/js/app-01ab31dk.js"></script>
mtpultz commented 7 years ago

Looks like if I don't use $.rev.manifest() it works. Any ideas on how to get the manifest file as well?

mtpultz commented 7 years ago

Figured it out. $.rev.manifest() has to be invoked after revReplace and the output of the template to its destination, otherwise no replace occurs if performed in filter, and no template is output if placed before replace.

    return gulp.src(masterFile)
               .pipe($.useref({
                   searchPath: ['public']
               }))

               // Apply error handling to the task
               .pipe($.plumber())

               // Output list of files in the stream if --verbose used in terminal
               // .pipe(args.verbose ? $.print() : $.util.noop())

               // Filter out only the assets from the stream for processing, which
               // includes revisions and gzip (optional) before being output to
               // their associated destinations, and then return the changes
               // to the stream
               .pipe(filterAssets)
               .pipe($.rev())
               .pipe($.gzip())
               .pipe(gulp.dest(config.publicPath))
-              .pipe($.rev.manifest())
-              .pipe(gulp.dest(publicBuildFolder));
               .pipe(filterAssets.restore)

               // Replace the revisioned and gzipped (optional) asset file names in
               // the streamed template file
               // ---
               // NOTE: Extension .php is not a default for the plugin and needs to
               // be added
               .pipe($.revReplace({
                   replaceInExtensions: ['.php']
               }))

               // Filter out the updated template from the stream, and output it to
               // its associated build directory
               .pipe(filterHtml)
               .pipe(gulp.dest(viewBuildFolder))
               .pipe(filterHtml.restore)

               // Create and output a revision manifest file
               // ---
               // NOTE: Must be applied at the end otherwise it will prevent replace
               // and output of the updated template from the stream
+              .pipe($.rev.manifest())
+              .pipe(gulp.dest(publicBuildFolder));