Skip to content

Commit 141ab99

Browse files
nkzawarauchg
authored andcommitted
build on tmp dir (vercel#1150)
1 parent ff54775 commit 141ab99

7 files changed

Lines changed: 39 additions & 35 deletions

File tree

‎.gitignore‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ npm-debug.log
99

1010
# other
1111
.next
12-
.next-*
1312

1413
# coverage
1514
.nyc_output

‎server/build/clean.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { resolve } from 'path'
22
import del from 'del'
33

4-
export default function clean (dir, folderName = '.next') {
5-
return del(resolve(dir, folderName))
4+
export default function clean (dir) {
5+
return del(resolve(dir, '.next'))
66
}

‎server/build/gzip.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import path from 'path'
33
import zlib from 'zlib'
44
import glob from 'glob-promise'
55

6-
export default async function gzipAssets (dir, buildFolder = '.next') {
7-
const nextDir = path.resolve(dir, buildFolder)
6+
export default async function gzipAssets (dir) {
7+
const nextDir = path.resolve(dir, '.next')
88

99
const coreAssets = [
1010
path.join(nextDir, 'commons.js'),

‎server/build/index.js‎

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
1+
import { tmpdir } from 'os'
2+
import { join } from 'path'
13
import fs from 'mz/fs'
24
import uuid from 'uuid'
3-
import path from 'path'
5+
import del from 'del'
46
import webpack from './webpack'
5-
import clean from './clean'
67
import gzipAssets from './gzip'
78
import replaceCurrentBuild from './replace'
89

910
export default async function build (dir) {
10-
const distFolder = '.next'
11-
const buildFolder = `.next-${uuid.v4()}`
12-
const compiler = await webpack(dir, buildFolder)
11+
const buildDir = join(tmpdir(), uuid.v4())
12+
const compiler = await webpack(dir, { buildDir })
1313

14-
await runCompiler(compiler)
15-
const oldFolder = await replaceCurrentBuild(dir, buildFolder, distFolder)
16-
await gzipAssets(dir, distFolder)
17-
await writeBuildId(dir, distFolder)
14+
try {
15+
await runCompiler(compiler)
16+
await gzipAssets(buildDir)
17+
await writeBuildId(buildDir)
18+
} catch (err) {
19+
console.error(`> Failed to build on ${buildDir}`)
20+
throw err
21+
}
1822

19-
clean(dir, oldFolder)
23+
await replaceCurrentBuild(dir, buildDir)
24+
25+
// no need to wait
26+
del(buildDir)
2027
}
2128

2229
function runCompiler (compiler) {
@@ -37,8 +44,8 @@ function runCompiler (compiler) {
3744
})
3845
}
3946

40-
async function writeBuildId (dir, distFolder) {
41-
const buildIdPath = path.resolve(dir, distFolder, 'BUILD_ID')
47+
async function writeBuildId (dir) {
48+
const buildIdPath = join(dir, '.next', 'BUILD_ID')
4249
const buildId = uuid.v4()
4350
await fs.writeFile(buildIdPath, buildId, 'utf8')
4451
}

‎server/build/replace.js‎

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import fs from 'fs'
2-
import path from 'path'
3-
import uuid from 'uuid'
1+
import { rename } from 'mz/fs'
2+
import { join } from 'path'
43

5-
export default function replaceCurrentBuild (dir, buildFolder, distFolder) {
6-
const distDir = path.resolve(dir, distFolder)
7-
const buildDir = path.resolve(dir, buildFolder)
8-
const oldDir = path.resolve(dir, `.next-${uuid.v4()}`)
4+
export default async function replaceCurrentBuild (dir, buildDir) {
5+
const _dir = join(dir, '.next')
6+
const _buildDir = join(buildDir, '.next')
7+
const oldDir = join(buildDir, '.next.old')
98

10-
return new Promise((resolve, reject) => {
11-
fs.rename(distDir, oldDir, () => {
12-
fs.rename(buildDir, distDir, (err) => {
13-
if (err) return reject(err)
14-
resolve(oldDir)
15-
})
16-
})
17-
})
9+
try {
10+
await rename(_dir, oldDir)
11+
} catch (err) {
12+
if (err.code !== 'ENOENT') throw err
13+
}
14+
await rename(_buildDir, _dir)
15+
return oldDir
1816
}

‎server/build/webpack.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const interpolateNames = new Map(defaultPages.map((p) => {
2323
return [join(nextPagesDir, p), `dist/pages/${p}`]
2424
}))
2525

26-
export default async function createCompiler (dir, buildFolder, { dev = false, quiet = false } = {}) {
26+
export default async function createCompiler (dir, { dev = false, quiet = false, buildDir } = {}) {
2727
dir = resolve(dir)
2828
const config = getConfig(dir)
2929
const defaultEntries = dev
@@ -228,7 +228,7 @@ export default async function createCompiler (dir, buildFolder, { dev = false, q
228228
context: dir,
229229
entry,
230230
output: {
231-
path: join(dir, buildFolder || '.next'),
231+
path: join(buildDir || dir, '.next'),
232232
filename: '[name]',
233233
libraryTarget: 'commonjs2',
234234
publicPath: '/_webpack/',

‎server/hot-reloader.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export default class HotReloader {
3535

3636
async start () {
3737
const [compiler] = await Promise.all([
38-
webpack(this.dir, null, { dev: true, quiet: this.quiet }),
38+
webpack(this.dir, { dev: true, quiet: this.quiet }),
3939
clean(this.dir)
4040
])
4141

0 commit comments

Comments
 (0)