Add binary extraction
I temporarily removed this during the refactor so it needed to be added back. This time I bundled it with the nbin loader code since it's all related (will also make it easier to remove).
This commit is contained in:
parent
b9e7a3daa7
commit
51a5c77cb8
73
ci/build.ts
73
ci/build.ts
@ -260,35 +260,64 @@ class Builder {
|
|||||||
* Bundles the built code into a binary.
|
* Bundles the built code into a binary.
|
||||||
*/
|
*/
|
||||||
private async binary(binaryName: string): Promise<void> {
|
private async binary(binaryName: string): Promise<void> {
|
||||||
// Prepend code to the target which enables finding files within the binary.
|
const prependCode = async (code: string, relativeFilePath: string): Promise<void> => {
|
||||||
const prependLoader = async (relativeFilePath: string): Promise<void> => {
|
|
||||||
const filePath = path.join(this.buildPath, relativeFilePath)
|
const filePath = path.join(this.buildPath, relativeFilePath)
|
||||||
const shim = `
|
|
||||||
if (!global.NBIN_LOADED) {
|
|
||||||
try {
|
|
||||||
const nbin = require("nbin");
|
|
||||||
nbin.shimNativeFs("${this.buildPath}");
|
|
||||||
global.NBIN_LOADED = true;
|
|
||||||
const path = require("path");
|
|
||||||
const rg = require("vscode-ripgrep");
|
|
||||||
rg.binaryRgPath = rg.rgPath;
|
|
||||||
rg.rgPath = path.join(require("os").tmpdir(), "code-server", path.basename(rg.binaryRgPath));
|
|
||||||
} catch (error) { /* Not in the binary. */ }
|
|
||||||
}
|
|
||||||
`
|
|
||||||
const content = await fs.readFile(filePath, "utf8")
|
const content = await fs.readFile(filePath, "utf8")
|
||||||
if (!content.startsWith(shim)) {
|
if (!content.startsWith(code)) {
|
||||||
await fs.writeFile(filePath, shim + content)
|
await fs.writeFile(filePath, code + content)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unpack binaries since we can't run them within the binary.
|
||||||
|
const unpack = `
|
||||||
|
if (global.NBIN_LOADED) {
|
||||||
|
try {
|
||||||
|
const fs = require("fs-extra")
|
||||||
|
const rg = require("vscode-ripgrep")
|
||||||
|
const path = require("path")
|
||||||
|
const { logger, field } = require("@coder/logger")
|
||||||
|
|
||||||
|
const unpackExecutables = async (filePath, destination) => {
|
||||||
|
logger.debug("unpacking executable", field("src", filePath), field("dest", destination))
|
||||||
|
await fs.mkdirp(path.dirname(destination))
|
||||||
|
if (filePath && !(await fs.pathExists(destination))) {
|
||||||
|
await fs.writeFile(destination, await fs.readFile(filePath))
|
||||||
|
await fs.chmod(destination, "755")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unpackExecutables(rg.binaryRgPath, rg.rgPath).catch((error) => console.warn(error))
|
||||||
|
} catch (error) {
|
||||||
|
console.warn(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
// Enable finding files within the binary.
|
||||||
|
const loader = `
|
||||||
|
if (!global.NBIN_LOADED) {
|
||||||
|
try {
|
||||||
|
const nbin = require("nbin")
|
||||||
|
nbin.shimNativeFs("${this.buildPath}")
|
||||||
|
global.NBIN_LOADED = true
|
||||||
|
require("@coder/logger").logger.debug("shimmed file system at ${this.buildPath}")
|
||||||
|
const path = require("path")
|
||||||
|
const rg = require("vscode-ripgrep")
|
||||||
|
rg.binaryRgPath = rg.rgPath
|
||||||
|
rg.rgPath = path.join(require("os").tmpdir(), "code-server/binaries", path.basename(rg.binaryRgPath))
|
||||||
|
} catch (error) {
|
||||||
|
// Most likely not in the binary.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
await this.task("Prepending nbin loader", () => {
|
await this.task("Prepending nbin loader", () => {
|
||||||
return Promise.all([
|
return Promise.all([
|
||||||
prependLoader("out/node/entry.js"),
|
prependCode(loader, "out/node/entry.js"),
|
||||||
prependLoader("lib/vscode/out/vs/server/entry.js"),
|
prependCode(loader, "lib/vscode/out/vs/server/entry.js"),
|
||||||
prependLoader("lib/vscode/out/vs/server/fork.js"),
|
prependCode(loader + unpack, "lib/vscode/out/vs/server/fork.js"),
|
||||||
prependLoader("lib/vscode/out/bootstrap-fork.js"),
|
prependCode(loader, "lib/vscode/out/bootstrap-fork.js"),
|
||||||
prependLoader("lib/vscode/extensions/node_modules/typescript/lib/tsserver.js"),
|
prependCode(loader, "lib/vscode/extensions/node_modules/typescript/lib/tsserver.js"),
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -151,19 +151,6 @@ export const open = async (url: string): Promise<void> => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Extract a file to the temporary directory and make it executable. This is
|
|
||||||
* required since we can't execute binaries stored within our binary.
|
|
||||||
*/
|
|
||||||
export const unpackExecutables = async (filePath: string): Promise<void> => {
|
|
||||||
const destination = path.join(tmpdir, "binaries", path.basename(filePath))
|
|
||||||
if (filePath && !(await util.promisify(fs.exists)(destination))) {
|
|
||||||
await fs.mkdirp(tmpdir)
|
|
||||||
await fs.writeFile(destination, await fs.readFile(filePath))
|
|
||||||
await util.promisify(fs.chmod)(destination, "755")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For iterating over an enum's values.
|
* For iterating over an enum's values.
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user