in src/goInstallTools.ts [137:221]
export async function installTools(
missing: ToolAtVersion[],
goVersion: GoVersion,
silent?: boolean
): Promise<{ tool: ToolAtVersion; reason: string }[]> {
if (!missing) {
return [];
}
if (!silent) {
outputChannel.show();
}
outputChannel.clear();
const goForInstall = await getGoForInstall(goVersion);
const envForTools = toolInstallationEnvironment();
const toolsGopath = envForTools['GOPATH'];
let envMsg = `Tools environment: GOPATH=${toolsGopath}`;
if (envForTools['GOBIN']) {
envMsg += `, GOBIN=${envForTools['GOBIN']}`;
}
outputChannel.appendLine(envMsg);
let installingMsg = `Installing ${missing.length} ${missing.length > 1 ? 'tools' : 'tool'} at `;
if (envForTools['GOBIN']) {
installingMsg += `the configured GOBIN: ${envForTools['GOBIN']}`;
} else {
const p = toolsGopath
?.split(path.delimiter)
.map((e) => path.join(e, 'bin'))
.join(path.delimiter);
installingMsg += `${p}`;
}
// If the user is on Go >= 1.11, tools should be installed with modules enabled.
// This ensures that users get the latest tagged version, rather than master,
// which may be unstable.
let modulesOff = false;
if (goVersion?.lt('1.11')) {
modulesOff = true;
} else {
installingMsg += ' in module mode.';
}
outputChannel.appendLine(installingMsg);
missing.forEach((missingTool) => {
let toolName = missingTool.name;
if (missingTool.version) {
toolName += '@' + missingTool.version;
}
outputChannel.appendLine(' ' + toolName);
});
outputChannel.appendLine(''); // Blank line for spacing.
const failures: { tool: ToolAtVersion; reason: string }[] = [];
for (const tool of missing) {
const modulesOffForTool = modulesOff;
const failed = await installToolWithGo(tool, goForInstall, envForTools, !modulesOffForTool);
if (failed) {
failures.push({ tool, reason: failed });
} else if (tool.name === 'gopls') {
// Restart the language server if a new binary has been installed.
vscode.commands.executeCommand('go.languageserver.restart', RestartReason.INSTALLATION);
}
}
// Report detailed information about any failures.
outputChannel.appendLine(''); // blank line for spacing
if (failures.length === 0) {
outputChannel.appendLine('All tools successfully installed. You are ready to Go. :)');
} else {
// Show the output channel on failures, even if the installation should
// be silent.
if (silent) {
outputChannel.show();
}
outputChannel.appendLine(failures.length + ' tools failed to install.\n');
for (const failure of failures) {
outputChannel.appendLine(`${failure.tool.name}: ${failure.reason} `);
}
}
return failures;
}