in gulpfile.ts [270:362]
async function packageVsix(): Promise<void> {
// We use a staging folder so we have more control over exactly what goes into the .vsix
function copyToStagingFolder(relativeOrAbsSource: string, relativeDest: string): void {
const absSource = path.resolve(__dirname, relativeOrAbsSource);
const absDest = path.join(stagingFolder, relativeDest);
if (fse.statSync(absSource).isDirectory()) {
console.log(`Copying folder ${absSource} to staging folder`);
copyFolder(absSource, absDest);
} else {
console.log(`Copying file ${absSource} to staging folder`);
fse.copyFileSync(absSource, absDest);
}
}
let stagingFolder = getTempFilePath('staging', '');
console.log(`Staging folder: ${stagingFolder}`);
fse.mkdirpSync(stagingFolder);
// Copy files/folders to staging
for (let p of filesAndFoldersToPackage) {
copyToStagingFolder(p, p);
}
let filesInStaging = fse.readdirSync(stagingFolder);
filesInStaging.forEach(fn => assert(!/license/i.test(fn), `Should not have copied the original license file into staging: ${fn}`));
let expectedLicenseFileName: string;
if (languageServerAvailable) {
let languageServerSourcePath: string;
let licenseSourcePath: string;
if (languageServerPackagingPath) {
console.warn(`========== WARNING ==========: Packaging language server from local path instead of NuGet location`);
languageServerSourcePath = languageServerPackagingPath;
licenseSourcePath = path.join(languageServerPackagingPath, '../../../../..', languageServerLicenseFileName);
} else {
languageServerSourcePath = path.join(__dirname, languageServerFolderName);
licenseSourcePath = path.join(__dirname, languageServerFolderName, languageServerLicenseFileName);
}
console.warn(` Language server source path: ${languageServerSourcePath}`);
console.warn(` License source path: ${licenseSourcePath}`);
// Copy language server bits
copyToStagingFolder(languageServerSourcePath, languageServerFolderName);
// Copy license to staging main folder
copyToStagingFolder(licenseSourcePath, languageServerLicenseFileName);
expectedLicenseFileName = languageServerLicenseFileName;
} else {
// No language server available - jusy copy license.md to staging main folder
copyToStagingFolder(publicLicenseFileName, languageServerFolderName);
expectedLicenseFileName = publicLicenseFileName;
}
// Copy package.json to staging
let packageContents = fse.readJsonSync(path.join(__dirname, 'package.json'));
assert(packageContents.license, "package.json doesn't contain a license field?");
// ... modify package.json to point to language server license
packageContents.license = `SEE LICENSE IN ${expectedLicenseFileName}`;
// ... remove vscode:prepublish script from package, since everything's already built
delete packageContents.scripts['vscode:prepublish'];
fse.writeFileSync(path.join(stagingFolder, 'package.json'), JSON.stringify(packageContents, null, 2));
assert(fse.readFileSync(path.join(stagingFolder, 'package.json')).toString().includes(`"license": "SEE LICENSE IN ${expectedLicenseFileName}"`), "Language server license not correctly installed into staged package.json");
try {
console.log(`Running vsce package in staging folder ${stagingFolder}`);
shelljs.cd(stagingFolder);
executeInShell('vsce package --githubBranch main');
} finally {
shelljs.cd(__dirname);
}
// Copy vsix to current folder
let vsixName = fse.readdirSync(stagingFolder).find(fn => /\.vsix$/.test(fn));
if (!vsixName) {
throw new Error("Couldn't find a .vsix file");
}
let vsixDestPath = path.join(__dirname, vsixName);
if (!languageServerAvailable) {
vsixDestPath = vsixDestPath.replace('.vsix', '-no-languageserver.vsix');
}
if (fse.existsSync(vsixDestPath)) {
fse.unlinkSync(vsixDestPath);
}
fse.copyFileSync(path.join(stagingFolder, vsixName), vsixDestPath);
// Remove staging folder since packaging was a success
if (!preserveStagingFolder) {
rimraf.sync(stagingFolder);
}
console.log(`Packaged successfully to ${vsixDestPath}`);
}