/*---------------------------------------------------------------------------------------------* Copyright (c) Microsoft Corporation. All rights reserved.* Licensed under the MIT License. See License.txt in the project root for license information.*--------------------------------------------------------------------------------------------*/import * as fs from 'fs';import { hostname, release } from 'os';import { raceTimeout } from '../../base/common/async.js';import { toErrorMessage } from '../../base/common/errorMessage.js';import { isSigPipeError, onUnexpectedError, setUnexpectedErrorHandler } from '../../base/common/errors.js';import { Disposable } from '../../base/common/lifecycle.js';import { Schemas } from '../../base/common/network.js';import { isAbsolute, join } from '../../base/common/path.js';import { isWindows, isMacintosh } from '../../base/common/platform.js';import { cwd } from '../../base/common/process.js';import { URI } from '../../base/common/uri.js';import { IConfigurationService } from '../../platform/configuration/common/configuration.js';import { ConfigurationService } from '../../platform/configuration/common/configurationService.js';import { IDownloadService } from '../../platform/download/common/download.js';import { DownloadService } from '../../platform/download/common/downloadService.js';import { NativeParsedArgs } from '../../platform/environment/common/argv.js';import { INativeEnvironmentService } from '../../platform/environment/common/environment.js';import { NativeEnvironmentService } from '../../platform/environment/node/environmentService.js';import { ExtensionGalleryServiceWithNoStorageService } from '../../platform/extensionManagement/common/extensionGalleryService.js';import { IAllowedExtensionsService, IExtensionGalleryService, InstallOptions } from '../../platform/extensionManagement/common/extensionManagement.js';import { ExtensionSignatureVerificationService, IExtensionSignatureVerificationService } from '../../platform/extensionManagement/node/extensionSignatureVerificationService.js';import { ExtensionManagementCLI } from '../../platform/extensionManagement/common/extensionManagementCLI.js';import { IExtensionsProfileScannerService } from '../../platform/extensionManagement/common/extensionsProfileScannerService.js';import { IExtensionsScannerService } from '../../platform/extensionManagement/common/extensionsScannerService.js';import { ExtensionManagementService, INativeServerExtensionManagementService } from '../../platform/extensionManagement/node/extensionManagementService.js';import { ExtensionsScannerService } from '../../platform/extensionManagement/node/extensionsScannerService.js';import { IFileService } from '../../platform/files/common/files.js';import { FileService } from '../../platform/files/common/fileService.js';import { DiskFileSystemProvider } from '../../platform/files/node/diskFileSystemProvider.js';import { SyncDescriptor } from '../../platform/instantiation/common/descriptors.js';import { IInstantiationService } from '../../platform/instantiation/common/instantiation.js';import { InstantiationService } from '../../platform/instantiation/common/instantiationService.js';import { ServiceCollection } from '../../platform/instantiation/common/serviceCollection.js';import { ILanguagePackService } from '../../platform/languagePacks/common/languagePacks.js';import { NativeLanguagePackService } from '../../platform/languagePacks/node/languagePacks.js';import { ConsoleLogger, getLogLevel, ILogger, ILoggerService, ILogService, LogLevel } from '../../platform/log/common/log.js';import { FilePolicyService } from '../../platform/policy/common/filePolicyService.js';import { IPolicyService, NullPolicyService } from '../../platform/policy/common/policy.js';import { NativePolicyService } from '../../platform/policy/node/nativePolicyService.js';import product from '../../platform/product/common/product.js';import { IProductService } from '../../platform/product/common/productService.js';import { IRequestService } from '../../platform/request/common/request.js';import { RequestService } from '../../platform/request/node/requestService.js';import { SaveStrategy, StateReadonlyService } from '../../platform/state/node/stateService.js';import { resolveCommonProperties } from '../../platform/telemetry/common/commonProperties.js';import { ITelemetryService } from '../../platform/telemetry/common/telemetry.js';import { ITelemetryServiceConfig, TelemetryService } from '../../platform/telemetry/common/telemetryService.js';import { supportsTelemetry, NullTelemetryService, getPiiPathsFromEnvironment, isInternalTelemetry, ITelemetryAppender } from '../../platform/telemetry/common/telemetryUtils.js';import { OneDataSystemAppender } from '../../platform/telemetry/node/1dsAppender.js';import { buildTelemetryMessage } from '../../platform/telemetry/node/telemetry.js';import { IUriIdentityService } from '../../platform/uriIdentity/common/uriIdentity.js';import { UriIdentityService } from '../../platform/uriIdentity/common/uriIdentityService.js';import { IUserDataProfile, IUserDataProfilesService } from '../../platform/userDataProfile/common/userDataProfile.js';import { UserDataProfilesReadonlyService } from '../../platform/userDataProfile/node/userDataProfile.js';import { resolveMachineId, resolveSqmId, resolvedevDeviceId } from '../../platform/telemetry/node/telemetryUtils.js';import { ExtensionsProfileScannerService } from '../../platform/extensionManagement/node/extensionsProfileScannerService.js';import { LogService } from '../../platform/log/common/logService.js';import { LoggerService } from '../../platform/log/node/loggerService.js';import { localize } from '../../nls.js';import { FileUserDataProvider } from '../../platform/userData/common/fileUserDataProvider.js';import { addUNCHostToAllowlist, getUNCHost } from '../../base/node/unc.js';import { AllowedExtensionsService } from '../../platform/extensionManagement/common/allowedExtensionsService.js';import { McpManagementCli } from '../../platform/mcp/common/mcpManagementCli.js';import { IExtensionGalleryManifestService } from '../../platform/extensionManagement/common/extensionGalleryManifest.js';import { ExtensionGalleryManifestService } from '../../platform/extensionManagement/common/extensionGalleryManifestService.js';class CliMain extends Disposable {constructor(private argv: NativeParsedArgs) {super();this.registerListeners();}private registerListeners(): void {// Dispose on exitprocess.once('exit', () => this.dispose());}async run(): Promise<void> {// Servicesconst [instantiationService, appenders] = await this.initServices();return instantiationService.invokeFunction(async accessor => {const logService = accessor.get(ILogService);const fileService = accessor.get(IFileService);const environmentService = accessor.get(INativeEnvironmentService);const userDataProfilesService = accessor.get(IUserDataProfilesService);// Log infologService.info('CLI main', this.argv);// Error handlerthis.registerErrorHandler(logService);// Run based on argvawait this.doRun(environmentService, fileService, userDataProfilesService, instantiationService);// Flush the remaining data in AI adapter (with 1s timeout)await Promise.all(appenders.map(a => {raceTimeout(a.flush(), 1000);}));return;});}private async initServices(): Promise<[IInstantiationService, ITelemetryAppender[]]> {const services = new ServiceCollection();// Productconst productService = { _serviceBrand: undefined, ...product };services.set(IProductService, productService);// Environmentconst environmentService = new NativeEnvironmentService(this.argv, productService);services.set(INativeEnvironmentService, environmentService);// Init foldersawait Promise.all([this.allowWindowsUNCPath(environmentService.appSettingsHome.with({ scheme: Schemas.file }).fsPath),this.allowWindowsUNCPath(environmentService.extensionsPath)].map(path => path ? fs.promises.mkdir(path, { recursive: true }) : undefined));// Loggerconst loggerService = new LoggerService(getLogLevel(environmentService), environmentService.logsHome);services.set(ILoggerService, loggerService);// Logconst logger = this._register(loggerService.createLogger('cli', { name: localize('cli', "CLI") }));const otherLoggers: ILogger[] = [];if (loggerService.getLogLevel() === LogLevel.Trace) {otherLoggers.push(new ConsoleLogger(loggerService.getLogLevel()));}const logService = this._register(new LogService(logger, otherLoggers));services.set(ILogService, logService);// Filesconst fileService = this._register(new FileService(logService));services.set(IFileService, fileService);const diskFileSystemProvider = this._register(new DiskFileSystemProvider(logService));fileService.registerProvider(Schemas.file, diskFileSystemProvider);// Uri Identityconst uriIdentityService = new UriIdentityService(fileService);services.set(IUriIdentityService, uriIdentityService);// User Data Profilesconst stateService = new StateReadonlyService(SaveStrategy.DELAYED, environmentService, logService, fileService);const userDataProfilesService = new UserDataProfilesReadonlyService(stateService, uriIdentityService, environmentService, fileService, logService);services.set(IUserDataProfilesService, userDataProfilesService);// Use FileUserDataProvider for user data to// enable atomic read / write operations.fileService.registerProvider(Schemas.vscodeUserData, new FileUserDataProvider(Schemas.file, diskFileSystemProvider, Schemas.vscodeUserData, userDataProfilesService, uriIdentityService, logService));// Policylet policyService: IPolicyService | undefined;if (isWindows && productService.win32RegValueName) {policyService = this._register(new NativePolicyService(logService, productService.win32RegValueName));} else if (isMacintosh && productService.darwinBundleIdentifier) {policyService = this._register(new NativePolicyService(logService, productService.darwinBundleIdentifier));} else if (environmentService.policyFile) {policyService = this._register(new FilePolicyService(environmentService.policyFile, fileService, logService));} else {policyService = new NullPolicyService();}services.set(IPolicyService, policyService);// Configurationconst configurationService = this._register(new ConfigurationService(userDataProfilesService.defaultProfile.settingsResource, fileService, policyService, logService));services.set(IConfigurationService, configurationService);// Initializeawait Promise.all([stateService.init(),configurationService.initialize()]);// Get machine IDlet machineId: string | undefined = undefined;try {machineId = await resolveMachineId(stateService, logService);} catch (error) {if (error.code !== 'ENOENT') {logService.error(error);}}const sqmId = await resolveSqmId(stateService, logService);const devDeviceId = await resolvedevDeviceId(stateService, logService);// Initialize user data profiles after initializing the stateuserDataProfilesService.init();// URI Identityservices.set(IUriIdentityService, new UriIdentityService(fileService));// Requestconst requestService = new RequestService('local', configurationService, environmentService, logService);services.set(IRequestService, requestService);// Download Serviceservices.set(IDownloadService, new SyncDescriptor(DownloadService, undefined, true));// Extensionsservices.set(IExtensionsProfileScannerService, new SyncDescriptor(ExtensionsProfileScannerService, undefined, true));services.set(IExtensionsScannerService, new SyncDescriptor(ExtensionsScannerService, undefined, true));services.set(IExtensionSignatureVerificationService, new SyncDescriptor(ExtensionSignatureVerificationService, undefined, true));services.set(IAllowedExtensionsService, new SyncDescriptor(AllowedExtensionsService, undefined, true));services.set(INativeServerExtensionManagementService, new SyncDescriptor(ExtensionManagementService, undefined, true));services.set(IExtensionGalleryManifestService, new SyncDescriptor(ExtensionGalleryManifestService));services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryServiceWithNoStorageService, undefined, true));// Localizationsservices.set(ILanguagePackService, new SyncDescriptor(NativeLanguagePackService, undefined, false));// Telemetryconst appenders: ITelemetryAppender[] = [];const isInternal = isInternalTelemetry(productService, configurationService);if (supportsTelemetry(productService, environmentService)) {if (productService.aiConfig && productService.aiConfig.ariaKey) {appenders.push(new OneDataSystemAppender(requestService, isInternal, 'monacoworkbench', null, productService.aiConfig.ariaKey));}const config: ITelemetryServiceConfig = {appenders,sendErrorTelemetry: false,commonProperties: resolveCommonProperties(release(), hostname(), process.arch, productService.commit, productService.version, machineId, sqmId, devDeviceId, isInternal),piiPaths: getPiiPathsFromEnvironment(environmentService)};services.set(ITelemetryService, new SyncDescriptor(TelemetryService, [config], false));} else {services.set(ITelemetryService, NullTelemetryService);}return [new InstantiationService(services), appenders];}private allowWindowsUNCPath(path: string): string {if (isWindows) {const host = getUNCHost(path);if (host) {addUNCHostToAllowlist(host);}}return path;}private registerErrorHandler(logService: ILogService): void {// Install handler for unexpected errorssetUnexpectedErrorHandler(error => {const message = toErrorMessage(error, true);if (!message) {return;}logService.error(`[uncaught exception in CLI]: ${message}`);});// Handle unhandled errors that can occurprocess.on('uncaughtException', err => {if (!isSigPipeError(err)) {onUnexpectedError(err);}});process.on('unhandledRejection', (reason: unknown) => onUnexpectedError(reason));}private async doRun(environmentService: INativeEnvironmentService, fileService: IFileService, userDataProfilesService: IUserDataProfilesService, instantiationService: IInstantiationService): Promise<void> {let profile: IUserDataProfile | undefined = undefined;if (environmentService.args.profile) {profile = userDataProfilesService.profiles.find(p => p.name === environmentService.args.profile);if (!profile) {throw new Error(`Profile '${environmentService.args.profile}' not found.`);}}const profileLocation = (profile ?? userDataProfilesService.defaultProfile).extensionsResource;// List Extensionsif (this.argv['list-extensions']) {return instantiationService.createInstance(ExtensionManagementCLI, new ConsoleLogger(LogLevel.Info, false)).listExtensions(!!this.argv['show-versions'], this.argv['category'], profileLocation);}// Install Extensionelse if (this.argv['install-extension'] || this.argv['install-builtin-extension']) {const installOptions: InstallOptions = { isMachineScoped: !!this.argv['do-not-sync'], installPreReleaseVersion: !!this.argv['pre-release'], donotIncludePackAndDependencies: !!this.argv['do-not-include-pack-dependencies'], profileLocation };return instantiationService.createInstance(ExtensionManagementCLI, new ConsoleLogger(LogLevel.Info, false)).installExtensions(this.asExtensionIdOrVSIX(this.argv['install-extension'] || []), this.asExtensionIdOrVSIX(this.argv['install-builtin-extension'] || []), installOptions, !!this.argv['force']);}// Uninstall Extensionelse if (this.argv['uninstall-extension']) {return instantiationService.createInstance(ExtensionManagementCLI, new ConsoleLogger(LogLevel.Info, false)).uninstallExtensions(this.asExtensionIdOrVSIX(this.argv['uninstall-extension']), !!this.argv['force'], profileLocation);}else if (this.argv['update-extensions']) {return instantiationService.createInstance(ExtensionManagementCLI, new ConsoleLogger(LogLevel.Info, false)).updateExtensions(profileLocation);}// Locate Extensionelse if (this.argv['locate-extension']) {return instantiationService.createInstance(ExtensionManagementCLI, new ConsoleLogger(LogLevel.Info, false)).locateExtension(this.argv['locate-extension']);}// Install MCP serverelse if (this.argv['add-mcp']) {return instantiationService.createInstance(McpManagementCli, new ConsoleLogger(LogLevel.Info, false)).addMcpDefinitions(this.argv['add-mcp']);}// Telemetryelse if (this.argv['telemetry']) {console.log(await buildTelemetryMessage(environmentService.appRoot, environmentService.extensionsPath));}}private asExtensionIdOrVSIX(inputs: string[]): (string | URI)[] {return inputs.map(input => /\.vsix$/i.test(input) ? URI.file(isAbsolute(input) ? input : join(cwd(), input)) : input);}}export async function main(argv: NativeParsedArgs): Promise<void> {const cliMain = new CliMain(argv);try {await cliMain.run();} finally {cliMain.dispose();}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。