1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# Based on previous attempts:
# - <https://github.com/msteen/nixos-vsliveshare/blob/master/pkgs/vsliveshare/default.nix>
# - <https://github.com/NixOS/nixpkgs/issues/41189>
{ lib, gccStdenv, vscode-utils
, jq, autoPatchelfHook, bash, makeWrapper
, dotnet-sdk_3, curl, gcc, icu, libkrb5, libsecret, libunwind, libX11, lttng-ust, openssl, util-linux, zlib
, desktop-file-utils, xprop, xsel
}:
with lib;
let
# https://docs.microsoft.com/en-us/visualstudio/liveshare/reference/linux#install-prerequisites-manually
libs = [
# .NET Core
openssl
libkrb5
zlib
icu
# Credential Storage
libsecret
# NodeJS
libX11
# https://github.com/flathub/com.visualstudio.code.oss/issues/11#issuecomment-392709170
libunwind
lttng-ust
curl
# General
gcc.cc.lib
util-linux # libuuid
];
in ((vscode-utils.override { stdenv = gccStdenv; }).buildVscodeMarketplaceExtension {
mktplcRef = {
name = "vsliveshare";
publisher = "ms-vsliveshare";
version = "1.0.5043";
sha256 = "OdFOFvidUV/trySHvF8iELPNVP2kq8+vZQ4q4Nf7SiQ=";
};
}).overrideAttrs({ nativeBuildInputs ? [], buildInputs ? [], ... }: {
nativeBuildInputs = nativeBuildInputs ++ [
bash
jq
autoPatchelfHook
makeWrapper
];
buildInputs = buildInputs ++ libs;
# Using a patch file won't work, because the file changes too often, causing the patch to fail on most updates.
# Rather than patching the calls to functions, we modify the functions to return what we want,
# which is less likely to break in the future.
postPatch = ''
sed -i \
-e 's/updateExecutablePermissionsAsync() {/& return;/' \
-e 's/isInstallCorrupt(traceSource, manifest) {/& return false;/' \
out/prod/extension-prod.js
declare ext_unique_id
ext_unique_id="$(basename "$out")"
# Fix extension attempting to write to 'modifiedInternalSettings.json'.
# Move this write to the tmp directory indexed by the nix store basename.
substituteInPlace out/prod/extension-prod.js \
--replace "path.resolve(constants_1.EXTENSION_ROOT_PATH, './modifiedInternalSettings.json')" \
"path.join(os.tmpdir(), '$ext_unique_id-modifiedInternalSettings.json')"
# Fix extension attempting to write to 'vsls-agent.lock'.
# Move this write to the tmp directory indexed by the nix store basename.
substituteInPlace out/prod/extension-prod.js \
--replace "path + '.lock'" \
"__webpack_require__('path').join(__webpack_require__('os').tmpdir(), '$ext_unique_id-vsls-agent.lock')"
# Hardcode executable paths
echo '#!/bin/sh' >node_modules/@vsliveshare/vscode-launcher-linux/check-reqs.sh
substituteInPlace node_modules/@vsliveshare/vscode-launcher-linux/install.sh \
--replace desktop-file-install ${desktop-file-utils}/bin/desktop-file-install
substituteInPlace node_modules/@vsliveshare/vscode-launcher-linux/uninstall.sh \
--replace update-desktop-database ${desktop-file-utils}/bin/update-desktop-database
substituteInPlace node_modules/@vsliveshare/vscode-launcher-linux/vsls-launcher \
--replace /bin/bash ${bash}/bin/bash
substituteInPlace out/prod/extension-prod.js \
--replace xprop ${xprop}/bin/xprop \
--replace "'xsel'" "'${xsel}/bin/xsel'"
'';
postInstall = ''
cd $out/share/vscode/extensions/ms-vsliveshare.vsliveshare
bash -s <<ENDSUBSHELL
shopt -s extglob
# A workaround to prevent the journal filling up due to diagnostic logging.
# See: https://github.com/MicrosoftDocs/live-share/issues/1272
# See: https://unix.stackexchange.com/questions/481799/how-to-prevent-a-process-from-writing-to-the-systemd-journal
gcc -fPIC -shared -ldl -o dotnet_modules/noop-syslog.so ${./noop-syslog.c}
# Normally the copying of the right executables is done externally at a later time,
# but we want it done at installation time.
cp dotnet_modules/exes/linux-x64/* dotnet_modules
# The required executables are already copied over,
# and the other runtimes won't be used and thus are just a waste of space.
rm -r dotnet_modules/exes dotnet_modules/runtimes/!(linux-x64|unix)
# Not all executables and libraries are executable, so make sure that they are.
jq <package.json '.executables.linux[]' -r | xargs chmod +x
# Lock the extension downloader.
touch install-linux.Lock externalDeps-linux.Lock
ENDSUBSHELL
'';
postFixup = ''
# We cannot use `wrapProgram`, because it will generate a relative path,
# which will break when copying over the files.
mv dotnet_modules/vsls-agent{,-wrapped}
makeWrapper $PWD/dotnet_modules/vsls-agent{-wrapped,} \
--prefix LD_LIBRARY_PATH : "${makeLibraryPath libs}" \
--set LD_PRELOAD $PWD/dotnet_modules/noop-syslog.so \
--set DOTNET_ROOT ${dotnet-sdk_3}
'';
meta = {
description = "Live Share lets you achieve greater confidence at speed by streamlining collaborative editing, debugging, and more in real-time during development";
homepage = "https://aka.ms/vsls-docs";
license = licenses.unfree;
maintainers = with maintainers; [ jraygauthier V ];
platforms = [ "x86_64-linux" ];
};
})
|