in src/goBuild.ts [72:176]
export async function goBuild(
fileUri: vscode.Uri,
isMod: boolean,
goConfig: vscode.WorkspaceConfiguration,
buildWorkspace?: boolean
): Promise<ICheckResult[]> {
epoch++;
const closureEpoch = epoch;
if (tokenSource) {
if (running) {
tokenSource.cancel();
}
tokenSource.dispose();
}
tokenSource = new vscode.CancellationTokenSource();
const updateRunning = () => {
if (closureEpoch === epoch) {
running = false;
}
};
const currentWorkspace = getWorkspaceFolderPath(fileUri);
const cwd = buildWorkspace && currentWorkspace ? currentWorkspace : path.dirname(fileUri.fsPath);
if (!path.isAbsolute(cwd)) {
return Promise.resolve([]);
}
// Skip building if cwd is in the module cache
if (isMod && cwd.startsWith(getModuleCache())) {
return [];
}
const buildEnv = toolExecutionEnvironment();
const tmpPath = getTempFilePath('go-code-check');
const isTestFile = fileUri && fileUri.fsPath.endsWith('_test.go');
const buildFlags: string[] = isTestFile
? getTestFlags(goConfig)
: Array.isArray(goConfig['buildFlags'])
? [...goConfig['buildFlags']]
: [];
const buildArgs: string[] = isTestFile ? ['test', '-c'] : ['build'];
if (goConfig['installDependenciesWhenBuilding'] === true && !isMod) {
buildArgs.push('-i');
// Remove the -i flag from user as we add it anyway
if (buildFlags.indexOf('-i') > -1) {
buildFlags.splice(buildFlags.indexOf('-i'), 1);
}
}
buildArgs.push(...buildFlags);
if (goConfig['buildTags'] && buildFlags.indexOf('-tags') === -1) {
buildArgs.push('-tags');
buildArgs.push(goConfig['buildTags']);
}
if (buildWorkspace && currentWorkspace && !isTestFile) {
outputChannel.appendLine(`Starting building the current workspace at ${currentWorkspace}`);
return getNonVendorPackages(currentWorkspace).then((pkgs) => {
running = true;
return runTool(
buildArgs.concat(Array.from(pkgs.keys())),
currentWorkspace,
'error',
true,
null,
buildEnv,
true,
tokenSource.token
).then((v) => {
updateRunning();
return v;
});
});
}
outputChannel.appendLine(`Starting building the current package at ${cwd}`);
const currentGoWorkspace = getCurrentGoWorkspaceFromGOPATH(getCurrentGoPath(), cwd);
let importPath = '.';
if (!isMod) {
// Find the right importPath instead of directly using `.`. Fixes https://github.com/Microsoft/vscode-go/issues/846
if (currentGoWorkspace && !isMod) {
importPath = cwd.substr(currentGoWorkspace.length + 1);
} else {
outputChannel.appendLine(
`Not able to determine import path of current package by using cwd: ${cwd} and Go workspace: ${currentGoWorkspace}`
);
}
}
running = true;
return runTool(
buildArgs.concat('-o', tmpPath, importPath),
cwd,
'error',
true,
null,
buildEnv,
true,
tokenSource.token
).then((v) => {
updateRunning();
return v;
});
}