1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00

build on tmp dir (#1150)

This commit is contained in:
Naoyuki Kanezawa 2017-02-15 22:03:33 +09:00 committed by Guillermo Rauch
parent ff547752f0
commit 141ab99888
7 changed files with 39 additions and 35 deletions

1
.gitignore vendored
View file

@ -9,7 +9,6 @@ npm-debug.log
# other
.next
.next-*
# coverage
.nyc_output

View file

@ -1,6 +1,6 @@
import { resolve } from 'path'
import del from 'del'
export default function clean (dir, folderName = '.next') {
return del(resolve(dir, folderName))
export default function clean (dir) {
return del(resolve(dir, '.next'))
}

View file

@ -3,8 +3,8 @@ import path from 'path'
import zlib from 'zlib'
import glob from 'glob-promise'
export default async function gzipAssets (dir, buildFolder = '.next') {
const nextDir = path.resolve(dir, buildFolder)
export default async function gzipAssets (dir) {
const nextDir = path.resolve(dir, '.next')
const coreAssets = [
path.join(nextDir, 'commons.js'),

View file

@ -1,22 +1,29 @@
import { tmpdir } from 'os'
import { join } from 'path'
import fs from 'mz/fs'
import uuid from 'uuid'
import path from 'path'
import del from 'del'
import webpack from './webpack'
import clean from './clean'
import gzipAssets from './gzip'
import replaceCurrentBuild from './replace'
export default async function build (dir) {
const distFolder = '.next'
const buildFolder = `.next-${uuid.v4()}`
const compiler = await webpack(dir, buildFolder)
const buildDir = join(tmpdir(), uuid.v4())
const compiler = await webpack(dir, { buildDir })
await runCompiler(compiler)
const oldFolder = await replaceCurrentBuild(dir, buildFolder, distFolder)
await gzipAssets(dir, distFolder)
await writeBuildId(dir, distFolder)
try {
await runCompiler(compiler)
await gzipAssets(buildDir)
await writeBuildId(buildDir)
} catch (err) {
console.error(`> Failed to build on ${buildDir}`)
throw err
}
clean(dir, oldFolder)
await replaceCurrentBuild(dir, buildDir)
// no need to wait
del(buildDir)
}
function runCompiler (compiler) {
@ -37,8 +44,8 @@ function runCompiler (compiler) {
})
}
async function writeBuildId (dir, distFolder) {
const buildIdPath = path.resolve(dir, distFolder, 'BUILD_ID')
async function writeBuildId (dir) {
const buildIdPath = join(dir, '.next', 'BUILD_ID')
const buildId = uuid.v4()
await fs.writeFile(buildIdPath, buildId, 'utf8')
}

View file

@ -1,18 +1,16 @@
import fs from 'fs'
import path from 'path'
import uuid from 'uuid'
import { rename } from 'mz/fs'
import { join } from 'path'
export default function replaceCurrentBuild (dir, buildFolder, distFolder) {
const distDir = path.resolve(dir, distFolder)
const buildDir = path.resolve(dir, buildFolder)
const oldDir = path.resolve(dir, `.next-${uuid.v4()}`)
export default async function replaceCurrentBuild (dir, buildDir) {
const _dir = join(dir, '.next')
const _buildDir = join(buildDir, '.next')
const oldDir = join(buildDir, '.next.old')
return new Promise((resolve, reject) => {
fs.rename(distDir, oldDir, () => {
fs.rename(buildDir, distDir, (err) => {
if (err) return reject(err)
resolve(oldDir)
})
})
})
try {
await rename(_dir, oldDir)
} catch (err) {
if (err.code !== 'ENOENT') throw err
}
await rename(_buildDir, _dir)
return oldDir
}

View file

@ -23,7 +23,7 @@ const interpolateNames = new Map(defaultPages.map((p) => {
return [join(nextPagesDir, p), `dist/pages/${p}`]
}))
export default async function createCompiler (dir, buildFolder, { dev = false, quiet = false } = {}) {
export default async function createCompiler (dir, { dev = false, quiet = false, buildDir } = {}) {
dir = resolve(dir)
const config = getConfig(dir)
const defaultEntries = dev
@ -228,7 +228,7 @@ export default async function createCompiler (dir, buildFolder, { dev = false, q
context: dir,
entry,
output: {
path: join(dir, buildFolder || '.next'),
path: join(buildDir || dir, '.next'),
filename: '[name]',
libraryTarget: 'commonjs2',
publicPath: '/_webpack/',

View file

@ -35,7 +35,7 @@ export default class HotReloader {
async start () {
const [compiler] = await Promise.all([
webpack(this.dir, null, { dev: true, quiet: this.quiet }),
webpack(this.dir, { dev: true, quiet: this.quiet }),
clean(this.dir)
])