diff --git a/pkgs/applications/editors/vscode/extensions/vscode-utils.nix b/pkgs/applications/editors/vscode/extensions/vscode-utils.nix index 8f0112e5f608..a9f66d8e9d48 100644 --- a/pkgs/applications/editors/vscode/extensions/vscode-utils.nix +++ b/pkgs/applications/editors/vscode/extensions/vscode-utils.nix @@ -5,6 +5,8 @@ let src, # Same as "Unique Identifier" on the extension's web page. # For the moment, only serve as unique extension dir. + vscodeExtPublisher, + vscodeExtName, vscodeExtUniqueId, configurePhase ? '' runHook preConfigure @@ -23,7 +25,10 @@ let name = "vscode-extension-${name}"; - inherit vscodeExtUniqueId; + passthru = { + inherit vscodeExtPublisher vscodeExtName vscodeExtUniqueId; + }; + inherit configurePhase buildPhase dontPatchELF dontStrip; installPrefix = "share/vscode/extensions/${vscodeExtUniqueId}"; @@ -54,9 +59,12 @@ let }: assert "" == name; assert null == src; buildVscodeExtension ((removeAttrs a [ "mktplcRef" "vsix" ]) // { name = "${mktplcRef.publisher}-${mktplcRef.name}-${mktplcRef.version}"; + version = mktplcRef.version; src = if (vsix != null) then vsix else fetchVsixFromVscodeMarketplace mktplcRef; + vscodeExtPublisher = mktplcRef.publisher; + vscodeExtName = mktplcRef.name; vscodeExtUniqueId = "${mktplcRef.publisher}.${mktplcRef.name}"; }); diff --git a/pkgs/applications/editors/vscode/with-extensions.nix b/pkgs/applications/editors/vscode/with-extensions.nix index 1c9c4be45631..b748a8dee976 100644 --- a/pkgs/applications/editors/vscode/with-extensions.nix +++ b/pkgs/applications/editors/vscode/with-extensions.nix @@ -1,4 +1,4 @@ -{ lib, stdenv, runCommand, buildEnv, vscode, makeWrapper +{ lib, stdenv, runCommand, buildEnv, vscode, makeWrapper, writeText , vscodeExtensions ? [] }: /* @@ -46,12 +46,47 @@ let wrappedPkgVersion = lib.getVersion vscode; wrappedPkgName = lib.removeSuffix "-${wrappedPkgVersion}" vscode.name; - combinedExtensionsDrv = buildEnv { - name = "vscode-extensions"; - paths = vscodeExtensions; + toExtensionJsonEntry = drv: rec { + identifier = { + id = "${drv.vscodeExtPublisher}.${drv.vscodeExtName}"; + uuid = ""; + }; + + version = drv.version; + + location = { + "$mid" = 1; + fsPath = drv.outPath + "/share/vscode/extensions/${drv.vscodeExtUniqueId}"; + path = location.fsPath; + scheme = "file"; + }; + + metadata = { + id = identifier.uuid; + publisherId = ""; + publisherDisplayName = drv.vscodeExtPublisher; + targetPlatform = "undefined"; + isApplicationScoped = false; + updated = false; + isPreReleaseVersion = false; + installedTimestamp = 0; + preRelease = false; + }; }; - extensionsFlag = lib.optionalString (vscodeExtensions != []) '' + extensionJson = builtins.toJSON (map toExtensionJsonEntry vscodeExtensions); + extensionJsonFile = writeText "extensions.json" extensionJson; + extensionJsonOutput = runCommand "vscode-extensions-json" {} '' + mkdir -p $out/share/vscode/extensions + cp ${extensionJsonFile} $out/share/vscode/extensions/extensions.json + ''; + + combinedExtensionsDrv = buildEnv { + name = "vscode-extensions"; + paths = vscodeExtensions ++ [ extensionJsonOutput ]; + }; + + extensionsFlag = '' --add-flags "--extensions-dir ${combinedExtensionsDrv}/share/vscode/extensions" ''; in