Compilation 使用Gulp在Rails应用程序中编译Bower组件
我用一组Gulp任务设置了我的Rails应用程序,这些任务将我的应用程序资产和供应商资产(样式和脚本)编译在一起,并将它们适当地输出到Compilation 使用Gulp在Rails应用程序中编译Bower组件,compilation,gulp,assets,Compilation,Gulp,Assets,我用一组Gulp任务设置了我的Rails应用程序,这些任务将我的应用程序资产和供应商资产(样式和脚本)编译在一起,并将它们适当地输出到public目录中。这很好,但它确实意味着当图像等资产从组件js或css文件链接到组件js或css文件时,由于主文件已编译,因此无法找到它 我已经研究了各种各样的解决方案,但似乎没有什么能满足我的需求,或者我似乎无法让它们发挥作用 理想情况下(我认为),我希望找出组件请求的图像等,并将它们移动到我的public/assets目录中的适当位置,然后更新引用以反映这一
public
目录中。这很好,但它确实意味着当图像等资产从组件js或css文件链接到组件js或css文件时,由于主文件已编译,因此无法找到它
我已经研究了各种各样的解决方案,但似乎没有什么能满足我的需求,或者我似乎无法让它们发挥作用
理想情况下(我认为),我希望找出组件请求的图像等,并将它们移动到我的public/assets
目录中的适当位置,然后更新引用以反映这一点
我在下面发布了我的完整的吞咽文件,这样你就可以看到我到目前为止所拥有的东西,但是任何关于我如何进行上述工作的帮助都将不胜感激
var gulp = require('gulp');
var sass = require('gulp-sass');
var concat = require('gulp-concat');
var rename = require('gulp-rename');
var util = require('gulp-util');
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var cssnano = require('cssnano');
var svgstore = require('gulp-svgstore');
var svgmin = require('gulp-svgmin');
var path = require('path');
var replace = require('gulp-replace');
// ===============================================================
var is_production = !(util.env.dev);
// ===============================================================
var vendor_styles = [
'./vendor/assets/bower-components/flickity/dist/flickity.css',
'./vendor/assets/bower-components/animate.css/animate.css',
'./vendor/assets/bower-components/leaflet/dist/leaflet.css'
];
var vendor_scripts = [
'./vendor/assets/bower-components/jquery/dist/jquery.min.js',
'./vendor/assets/bower-components/flickity/dist/flickity.pkgd.min.js',
'./vendor/assets/bower-components/jquery-ujs/src/rails.js',
'./vendor/assets/bower-components/modernizr/modernizr.js',
'./vendor/assets/bower-components/fancybox/source/jquery.fancybox.js',
'./vendor/assets/bower-components/jquery-backstretch/jquery.backstretch.js',
'./vendor/assets/bower-components/photoswipe/dist/photoswipe.min.js',
'./vendor/assets/bower-components/photoswipe/dist/photoswipe-ui-default.min.js',
'./vendor/assets/bower-components/drop/drop.min.js',
'./vendor/assets/bower-components/uri.js/src/URI.js',
'./vendor/assets/bower-components/svg4everybody/dist/svg4everybody.js',
'./vendor/assets/bower-components/css-element-queries/src/ResizeSensor.js',
'./vendor/assets/bower-components/leaflet/dist/leaflet.js',
'./vendor/assets/markermanager.js',
'./vendor/assets/jquery-throttle-debounce.js'
];
// ===============================================================
gulp.task('styles', function() {
var postcss_tools = [
autoprefixer({
browsers: ['last 3 versions']
})
];
if (is_production) {
postcss_tools.push(cssnano());
}
gulp.src('./app/assets/stylesheets/**/*.{sass,scss}')
.pipe(sass({outputStyle: 'expanded'}))
.pipe(rename('application.css'))
.pipe(postcss(postcss_tools))
.pipe(replace(/(url\(\.\.\/|\.\.\/)/i, '../bower_components/'))
.pipe(gulp.dest('./public/assets/stylesheets'));
});
gulp.task('scripts', function() {
gulp.src('./app/assets/javascripts/**/*.js')
.pipe(concat('application.js'))
.pipe(gulp.dest('./public/assets/javascripts'))
});
gulp.task('vendor_styles', function() {
gulp.src(vendor_styles)
.pipe(concat('vendor.css'))
.pipe(gulp.dest('./public/assets/stylesheets'))
});
gulp.task('vendor_scripts', function() {
gulp.src(vendor_scripts)
.pipe(concat('vendor.js'))
.pipe(gulp.dest('./public/assets/javascripts'))
});
gulp.task('svgs', function () {
gulp.src('./app/assets/svgs/**/*.svg')
.pipe(svgmin(function getOptions (file) {
var prefix = path.basename(file.relative, path.extname(file.relative));
return {
plugins: [{
cleanupIDs: {
prefix: prefix + '-',
minify: true
}
}]
}
}))
.pipe(svgstore())
.pipe(rename('application.svg'))
.pipe(gulp.dest('./public/assets/svgs'));
});
// ===============================================================
gulp.task('watch', ['styles', 'scripts', 'vendor_styles', 'vendor_scripts', 'svgs'], function() {
gulp.watch('./app/assets/stylesheets/**/*.scss', ['styles']);
gulp.watch('./app/assets/javascripts/**/*.js', ['scripts']);
gulp.watch('./app/assets/svgs/**/*.svg', ['svgs']);
});
gulp.task('default', ['watch']);
如果将引用的资产复制到正确的相对路径中,则不需要修改URL 实例 假设您有一个名为componentA的bower组件,其
styleA.css
引用了logoA.jpg
:
.logo {
background-image: url('./img/logoA.jpg') top left no-repeat;
}
该模块的结构如下所示:
bower_comonents/
\_ componentA/
\_ styleA.css
\_ img/
\_ logoA.jpg
编译在public/
文件夹中生成application.css
。此文件包含对logoA.jpg
(/img/logoA.jpg
)的引用。为了使此引用生效,logoA.jpg
需要复制到正确的相对路径中,
因此,编译后的结构如下所示:
public/
\_ application.css
\_ img/
\_ logoA.jpg
解决方案
我建议您做与JavaScript和CSS源代码相同的事情。只需在一个变量中列出它们,并在一个单独的吞咽任务中复制到public
比如:
var vendor_assets = [
'./vendor/assets/bower-components/flickity/dist/images/flickity.jpg',
'./vendor/assets/bower-components/leaflet/dist/images/leaflet.png',
];
gulp.task('vendor_assets', function() {
gulp.src(vendor_assets)
.pipe(gulp.dest('./public/assets/'))
});
这并不是我一直坚持的。这是如何将文件中的所有引用更改为我遇到问题的资产位置。是的,但如果将引用的资产复制到正确的相对路径中,则不需要这样做。我将预兆我的答案。这显然不是Rails项目。你为什么这么说?它实际上是一个Rails应用程序