背景

最近自己用nodercms搭建了一个简单的博客系统,用户发布一些自己谁便谢谢的文章。感谢nodercms团队,这个cms轻量易用,用于做个人博客太方便了。
开发了博客系统,肯定设计到部署到AWS或者阿里云等服务器上,那么,打包脚本就是必须的,这里,我自己修改了原有的gulp脚本,添加了打包脚本,实现了一键编译打包。这里就简单的介绍一下。

源文件地址

  1. https://gitlab.com/BowenHBX/nodercms-build-deploy

依赖

  1. "del": "^2.2.0",
  2. "gulp": "^3.8.11",
  3. "gulp-angular-templatecache": "^1.8.0",
  4. "gulp-autoprefixer": "^3.1.0",
  5. "gulp-clean-css": "^2.0.6",
  6. "gulp-concat": "^2.5.2",
  7. "gulp-less": "^3.0.5",
  8. "gulp-plumber": "^1.0.0",
  9. "gulp-uglify": "^1.5.2",
  10. "gulp-util": "^3.0.7",
  11. "shelljs": "^0.7.8",
  12. "run-sequence": "^2.0.0",

完善gulp脚本

其实nodercms团队的gulp编译脚本已经很完善了,我这里只是提取有用的文件并复制到一个临时文件夹下

  1. /**
  2. * 拷贝编译好的资源
  3. */
  4. gulp.task('copy_other_files', function() {
  5. gulp.src([
  6. './bin/**',
  7. './config/**',
  8. './core/**/*',
  9. './lib/**',
  10. './install.lock',
  11. './*.js',
  12. './*.json',
  13. './public/*.*',
  14. './public/assets/**',
  15. './public/themes/**',
  16. './README.md',
  17. '!./config/database.config.js'
  18. ], { base: './' })
  19. .pipe(gulp.dest('tmp'))
  20. });

简单说明:

./bin/** : nodercms启动文件存放目录

./config/** : 所有配置文件

!./config/database.config.js : 排除数据库配置,避免覆盖生产环境的数据库配置

其他的目录为node文件和资源模板文件

以上copy_other_files任务会将所有网站运行的必要文件复制到根目录的/tmp/文件加下

添加清除脚本

每次构建前我们都希望tmp文件是空的,避免有多余的旧文件保留

  1. /**
  2. * 清除 tmp
  3. */
  4. gulp.task('cleanTmp', function(cb) {
  5. return del(['./tmp'], cb);
  6. });

修改build任务

  1. /**
  2. * 生产模式编译
  3. */
  4. gulp.task('build', cb =>
  5. runSequence(
  6. 'cleanTmp',
  7. [
  8. 'build-admin-assets-less',
  9. 'concat-vendor-js-less',
  10. 'concat-vendor-css-less',
  11. 'concat-admin-js-less',
  12. 'concat-admin-views',
  13. 'copy-admin-assets',
  14. 'copy-admin-font-awersome-fonts',
  15. ],
  16. 'copy_other_files',
  17. cb
  18. )
  19. );

这里使用了“run-sequence”插件,该插件是为了让任务同步执行:

  • 清除tmp文件夹
  • 编译文件
  • 复制所有文件到tmp文件夹

到这里整个网站执行需要的文件就都在tmp文件夹下面了,接下来就是打包的工作

打包

在根目录添加文件夹build,在build中添加两个文件:deploy.js, deploy.sh,如下:

build.js文件如下:

  1. const shell = require('shelljs');
  2. const path = require('path');
  3. const pkgInfo = require('../package.json');
  4.  
  5. (function() {
  6. const appName = pkgInfo.name;
  7. const version = pkgInfo.version;
  8.  
  9. console.log(`deploy app name: ${appName}`);
  10.  
  11. // 版本号合法检查
  12. if (!version) {
  13. console.log('not ci tag or not params, don\'t pack!!!');
  14. return;
  15. }
  16.  
  17. // 进行打包
  18. deploy(`${appName}-${version}`);
  19.  
  20. // 调用发布shell
  21. function deploy(fileName) {
  22. shell.exec(`sh ../build/deploy.sh ${fileName}`, { cwd: path.resolve(__dirname, '../tmp/'), async: true });
  23. }
  24. }());

代码很简单:

  • 使用${appName}-${version}组成包的文件名
  • 使用shell执行deploy.sh脚本,将/tmp/目录里面的文件打包成${fileName}

shell脚本,deploy.sh的代码如下:

  1. #!/usr/bin/env bash
  2.  
  3. PACK_NAME="$1.tgz"
  4.  
  5. echo ">>> Installing prod dependencies..."
  6. npm i --production
  7. echo "<<<"
  8. echo ""
  9.  
  10. echo ">>> Packing..."
  11. touch $PACK_NAME;
  12. mkdir logs
  13. cd logs
  14. mkdir access && mkdir database && mkdir errors && mkdir system
  15. cd ../
  16. tar -czf ./$PACK_NAME --exclude=$PACK_NAME .
  17. echo "Package: $PACK_NAME"
  18. echo "<<<"
  19. echo ""
  20.  
  21. echo ">>> Show Package's Size..."
  22. ls -lh
  23. echo "<<<"
  24. echo ""
  25.  
  26. echo ">>> copy file"
  27. cd ../
  28. mkdir pack
  29. mv tmp/$PACK_NAME pack/
  30. echo "<<<"
  31. echo ""

这一部分的脚本也很好理解:

  1. 文件名为deploy.js里面的fileName加上".tgz"
  2. 创建文件夹logs,并且创建子目录access,database,errors,system(这一步很重要,不然启动的时候可能报权限错误,当然可以使用chmod 777 xxx来修改站点目录权限)
  3. 打包文件
  4. 输出文件大小
  5. 将打包的文件复制到/pack/文件夹下

修改package.json文件scripts配置

  1. "scripts": {
  2. "start": "node ./bin/www &",
  3. "build:dev": "gulp default",
  4. "build:prod": "gulp build",
  5. "deploy:prod": "gulp build && node build/deploy.js prod"
  6. }

当执行deploy:prod后,一个*.tgz文件就生成了,在/pack/目录下;

上传文件到服务器,解压,进入更目录,执行以下脚本nodercms就启动了

  1. $ npm start

到此,这个简单的构建脚本介绍就结束啦!

尊重知识产权,转载请说明出处!

适用于nodercms的打包构建脚本的更多相关文章

  1. 【Git】自动化Maven项目构建脚本(一)

    在公司服务器上搭了个自动化构建环境,一上午写了个构建脚本,现在贴出来给自己看 #!/bin/bash # .配置路径变量 propath=/home/hotspot/.autoBuild/projec ...

  2. es6零基础学习之构建脚本(二)

    编译器打开你的es6项目 首先:创建我们的第一个脚本,tasks/util/args.js      在文件里面要先引入一个包,处理命令行参数 import yargs from 'yargs'; / ...

  3. 【转载】Gradle学习 第六章:构建脚本基础

    转载地址:http://ask.android-studio.org/?/article/11 6.1. Projects and tasks 项目和任务Everything in Gradle si ...

  4. Android Jenkins 自动化打包构建

    前言 在测试app项目过程中,通常都是需要开发打测试包给到测试,但是无论是iOS还是Android的打包过程都是相当漫长的,频繁的回归测试需要频繁的打包,对于开发同学影响还是蛮大的.因此在这种情况下, ...

  5. 打包python脚本为exe可执行文件-pyinstaller和cx_freeze示例

    本文介绍使用cx_freeze和pyinstaller打包python脚本为exe文件 cx_freeze的使用实例 需要使用到的文件wxapp.py, read_file.py, setup.py ...

  6. Gradle 1.12 翻译——第十三章 编写构建脚本

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  7. PyInstaller打包Python脚本为exe

    1.PyInstaller-3.1.1  百度云链接  http://pan.baidu.com/s/1jHYWin8 密码  oapl 2.安装最新版本的 pywin32-217.win32-py2 ...

  8. Webpack打包构建太慢了?试试几个方法

    Webpack是个很流行的打包工具,但其打包速度却一直被吐槽着 如果不用上一些打包的优化建议,单单打包两三个文件就能花上好几秒,放上几十个入口文件依赖几百上千个包的话,几分钟十几分钟妥妥的 本文整理了 ...

  9. 约定Jenkins构建脚本

    对于Jenkins的使用,我感觉只用到其中一小部分功能,但也就是这一小部分功能,也推动了整个CI/CD的过程,Jenkins的使用方式有很多中,可能我用到的只是其中一种,但是已经满足我的需求,便不再贪 ...

随机推荐

  1. Flask 上下文管理

    为什么用threading.local? 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程 ...

  2. 把一个给定的值存储到一个整数中指定的几个位《C与指针5.8.5》

    编写一个函数,把一个给定的值存储到一个整数中指定的几个位.它的原型如下: int store_bit_field(int original_value, int value_to_store, uns ...

  3. AndroidStudio3.0 修改项目包名

    进入 Androidmanifest.xml,找到 package 名称,选中需要修改的部分. 如原包名为com.demo.musicplayer,如果改为com.musicplayer.那么选中当前 ...

  4. deep learning RNN

    specialize  vi. 专攻;特化;专门从事;详细说明 vt.使专门化;使适应特殊情况;详细说明;列举 generalize  across vt.& vi.概括,归纳;推广,普及;使 ...

  5. 常用socket选项

    1.socket选项通常:服务端应在listen 前设置,accpet返回的socket继承自监听套接字. 客户端应在connect之前设置 2.socket 如果有大量短连接应设置SO_LINGER ...

  6. 哈希表(Hash Map)

    今天第一次做Leetcode用到了散列表,之前学的数据结构的内容都忘了,正好趁热打铁补一补. 摘自其他博客的一个整合. 一.哈希表简介 数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈 ...

  7. vue day5 分页控件

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. antd-vue按需加载插件babel-plugin-import报错

    报错.bezierEasingMixin().百度了一下是Less版本太高的原因,我都迷了,还有太新的过... 解决方法:将less版本降到3.0以下 因为我是用的npm生成的vue项目.所以cmd命 ...

  9. JDK安装与环境配置——学习JAVA的准备工作

    1.安装JDK 官网,版本看了也不明白区别,我下载的第一个 JAVA SE 12 https://www.oracle.com/technetwork/java/javase/downloads/in ...

  10. Redis不支持ssl

    一直在公司内部推荐redis做cache管理,今天偶然想起虽然C#没问题,可是c/c++没查过可不可行. 结果查了一下,还真tmd有问题,官方的c client版本只支持linux side的,根本没 ...