Installation silencieuse de Microsoft Visual Studio 2017 Community Edition en mode hors ligne (offline)

Introduction

Microsoft a largement modifié son concept d'installation de Visual Studio 2017 par rapport aux versions précédentes, versions qui étaient livrées sous formes d'images ISO et installaient discrètement un trop grand nombre de composants.

Avec Visual Studio 2017, les composants sont désormais regroupés en "charges de travail" (workloads) et les installations sont devenues plus personnalisables pour chaque module avec l'introduction des notions de composants obligatoires, recommandés et optionnels.

Dans cet article une image complète de Visual Studio 2017 Community Edition est rapatriée en local et un déploiement des composants souhaités est réalisé en mode silencieux. Une image complète en local présente un intérêt majeur dans les environnements pour lesquels les accès internet ne sont pas fiables ou à bas débit mais également pour le déploiement ultérieur sur d'autres postes de travail ou une réinstallation.

Création de l'image hors ligne (Offline Layout)

Télécharger l'installeur de Visual Studio 2017 Community Edition vs_Community.exe (Téléchargements Visual Studio 2017).

Dans une commande DOS en tant qu'administrateur, lancer l'exécutable vs_Community.exe avec l'option --layout qui donne le répertoire de rapatriement en local des images. L'argument --lang accepte en paramètre la ou les langues souhaitées pour les composants (ici : l'anglais et le français).

vs_Community.exe --layout D:\MSVisualStudio\2017 --lang en-US fr-FR

Dans la ligne de commande ci-dessus, l'intégralité des composants est rapatriée : ainsi l'opération est faite une fois pour toutes, mais bien entendu il est possible de ne rapatrier qu'une liste de composants définie. Par exemple, pour ne rapatrier en local que le module C++ pour Visual Studio avec ses composants recommandés et optionnels :

vs_Community.exe --layout D:\MSVisualStudio\2017 ^
          --add Microsoft.VisualStudio.Workload.NativeDesktop ^
          --includeRecommended --includeOptional ^
          --lang en-US fr-FR

Dans le contexte d'installations silencieuses, la personnalisation des modules à déployer sera effectuée lors de cette étape, aussi mieux vaut tout télécharger maintenant.

vs_Community.exe --layout D:\MSVisualStudio\2017 --lang en-US fr-FR
...
Planning 'Layout' operation
Verified existing package 'Win10SDK.AppVerifier.Preparation,version=1.0.0'
...
Total packages to download: 1007
Starting 'Layout' operation
...
Download of ... succeeded using engine 'WebClient'
Layout progress: 1,41%
...
Layout progress: 81,78%
...

L'intégralité des modules nécessite environ 25 GB d'espace. Le téléchargement dure environ 5 à 8 heures en fonction du débit internet.

En cas de problème ou d'erreurs, tous les fichiers de log sont créés dans le répertoire %TEMP%

À propos des erreurs, il peut s'agir d'erreurs de téléchargements, mais également d'erreurs d'exécutions de scripts, quelques commandes powershell, Python... sont en effet lancées vers la fin du téléchargement :

Running 'C:\WINDOWS\SysWOW64\\WindowsPowerShell\v1.0\powershell.exe' with parameters: -NonInteractive -NoLogo -NoProfile -ExecutionPolicy Bypass -InputFormat None "$ErrorActionPreference="""Stop"""; $VerbosePreference="""Continue"""; $CeipSetting="""on"""; $ScriptPath="""D:\Logitheque\langages\MSVisualStudio\2017\Win10SDK_Hidden_10.0.10240_2,version=10.0.10240.117\WinSdkInstall.ps1"""; $SetupExe="""sdksetup.exe"""; $SetupLogFolder="""standalonesdk"""; $PackageId="""Win10SDK_Hidden_10.0.10240_2"""; $SetupParameters="""/layout """"""D:\Logitheque\langages\MSVisualStudio\2017\Win10SDK_Hidden_10.0.10240_2,version=10.0.10240.117"""""" /quiet"""; $PayloadsNotYetDownloaded=1; (gc $ScriptPath | out-string) | Invoke-Expression; if (!$?) { exit 1603 } elseif ($LastExitCode) { exit $LastExitCode }"
Layout progress: 90,50%

Des erreurs sont notamment levées sous Windows 7 lors du lancement de scripts PowerShell sur des bibliothèques SDK de Windows 10, ces erreurs sont naturellement "normales" et non pénalisantes.

Préparation du fichier JSON d'installation

Dans les précédentes versions de Visual Studio, le paramétrage des composants était consigné dans un fichier XML AdminDeployment.xml.

Désormais, bien plus simple, il s'agit d'un fichier au format JSON.

Ce fichier JSON doit être installé dans le répertoire racine de la distribution.

Un exemple est donné avec le fichier Response.template.json à la racine de la distribution téléchargée.

Pour une installation personnalisée, le choix des modules et composants est donc réalisé ici en préparant ce fichier JSON :

install_vstudio2017.json
{
   "installChannelUri": ".\\ChannelManifest.json"
  ,"channelUri": "https://aka.ms/vs/15/release/channel"
  ,"installCatalogUri": ".\\Catalog.json"
  ,"channelId": "VisualStudio.15.Release"
  ,"productId": "Microsoft.VisualStudio.Product.Community"

  ,"installPath": "D:\\software\\tools\\VS2017"
  ,"norestart": true
  ,"includeRecommended": true
  

  ,"addProductLang": [
    "en-US",
    "fr-FR"
  ]

  ,"add": [
        "Microsoft.VisualStudio.Workload.Data",
        "Microsoft.VisualStudio.Workload.DataScience",
        "Microsoft.VisualStudio.Workload.ManagedDesktop",
        "Microsoft.VisualStudio.Workload.NativeDesktop",
        "Microsoft.VisualStudio.Workload.Universal",
        "Component.GitHub.VisualStudio",
        "Microsoft.VisualStudio.Component.LinqToSql"
    ]
}

La première section est obligatoire, elle répertorie les catalogues de la distribution :

{...
   "installChannelUri": ".\\ChannelManifest.json"
  ,"channelUri": "https://aka.ms/vs/15/release/channel"
  ,"installCatalogUri": ".\\Catalog.json"
  ,"channelId": "VisualStudio.15.Release"
...}

L'édition du produit est ensuite donnée : Community, Enterprise...

{...
  ,"productId": "Microsoft.VisualStudio.Product.Community"
...}

Pour les versions avec licence (Enterprise...), la clé doit être donnée :

{...
  ,"productKey": "AABBCCDDEEFF0099DDMM77"
...}

La directive installPath existe pour spécifier un chemin d'installation mais elle présente très peu d'intérêt, seule une infime partie des composants est délocalisable. Avec la directive norestart, le redémarrage post installation est contrôlé.

{...
  ,"installPath": "D:\\software\\tools\\VS2017"
  ,"norestart": true
...}

Pour chaque module, l'installation des composants recommandés et optionnels est respectivement contrôlée avec les directives includeRecommended et includeOptional.

{...
  ,"includeRecommended": true
  ,"includeOptional": false
...}

L'ajout des langues est indiquée avec la directive addProductLang :

{...
  ,"addProductLang": [
    "en-US",
    "fr-FR"
  ]
...}

La liste des modules Visual Studio à installer est enfin donnée :

{...
,"add": [
        "Microsoft.VisualStudio.Workload.Data",
        "Microsoft.VisualStudio.Workload.DataScience",
        "Microsoft.VisualStudio.Workload.ManagedDesktop",
        "Microsoft.VisualStudio.Workload.NativeDesktop",
        "Microsoft.VisualStudio.Workload.Universal",
        "Component.GitHub.VisualStudio",
        "Microsoft.VisualStudio.Component.LinqToSql"
    ]
...}

Dans l'exemple ci-dessus, les besoins identifiés ont abouti au choix des modules suivants :

Microsoft.VisualStudio.Workload.Data Connecter, développer et tester des solutions SQL Server, Azure Data Lake, ou Hadoop
Microsoft.VisualStudio.Workload.DataScience Langages et outils pour créér des applications de sciences de données avec Python, R et F#
Microsoft.VisualStudio.Workload.ManagedDesktop Construction d'applications console, Windows Forms et WPF avec C#, Visual Basic et F#
Microsoft.VisualStudio.Workload.NativeDesktop Construction d'applications Windows avec Visual C++, ATL et les fonctionnalités optionnelles MFC et C++/CLI
Microsoft.VisualStudio.Workload.Universal Création d'applications Windows universelles avec C#, VB, Javascript et optionnellement C++
Component.GitHub.VisualStudio Extension GitHub pour Visual Studio
Microsoft.VisualStudio.Component.LinqToSql Extension LINQ vers les outils SQL

La liste des modules est très riche, énumérer tous les composants ne présente pas d'intérêt, la documentation officielle suffit largement : Visual Studio Community 2017 workload and component IDs

Lancement de l'installation silencieuse

L'installation silencieuse peut être enclenchée. Dans une invite de commandes DOS en tant qu'administrateur, la ligne de commandes est simple : le fichier JSON est donné en paramètre à l'exécutable vs_Community.exe avec l'option --in.

vs_Community.exe --quiet --wait --in D:\MSVisualStudio\2017\install_vstudio2017.json
Le chemin complet du fichier JSON doit être donné au paramètre in. Si un chemin relatif est donné, vs_installershell.exe recherche le fichier JSON dans le répertoire C:\Program Files (x86)\Microsoft Visual Studio\Installer

Les fichiers de logs dd_bootstrapper% sont créés dans le répertoire %TEMP%.

Ne pas utiliser l'option --nocache avec l'exécutable vs_Community.exe, cette option supprime les packages de la distribution locale après installation.

Dans un contexte d'une installation réseau en mode hors ligne, en tant qu'administrateur, la ligne de commande est guère différente après avoir défini un partage (VStudio2017) sur le répertoire contenant la distribution de Visual Studio :

\\SERVER\VStudio2017\vs_Community.exe --quiet --wait --in \\SERVER\VStudio2017\install_vstudio2017.json

En cas de doute sur le fichier JSON et les modules, avant l'installation silencieuse, lancer vs_Community.exe en mode graphique avec le fichier JSON en paramètre sans déclencher l'installation :

vs_Community.exe --in D:\MSVisualStudio\2017\install_vstudio2017.json
Visual Studio 2017 - Panel 1 Visual Studio 2017 - Panel 2

Ajout d'un composant

Pour ajouter un composant, rien de plus simple, préparer un nouveau fichier JSON avec le composant à ajouter dans le répertoire de la distribution , ici le module de développement Python est ajouté (Microsoft.VisualStudio.Workload.Python) :

vs_Community.exe --quiet --wait --in D:\MSVisualStudio\2017\addpythonmodule.json
addpythonmodule.json
{
  "installChannelUri": ".\\ChannelManifest.json"
  ,"channelUri": "https://aka.ms/vs/15/release/channel"
  ,"installCatalogUri": ".\\Catalog.json"
  ,"channelId": "VisualStudio.15.Release"
  ,"productId": "Microsoft.VisualStudio.Product.Community"
  
  ,"installPath": "D:\\software\\tools\\VS2017"
  ,"norestart": true
  ,"includeRecommended": true
  

  ,"addProductLang": [
    "en-US",
    "fr-FR"
  ]

  ,"add": [
        "Microsoft.VisualStudio.Workload.Python"
    ]
}

Suppression d'un composant

Pour supprimer un ou plusieurs composants, le mot clé add est tout simplement remplacé par le mot clé remove dans un fichier JSON.

vs_Community.exe --quiet --wait --in D:\MSVisualStudio\2017\removepythonmodule.json
removepythonmodule.json
{ ...

  ,"remove": [
        "Microsoft.VisualStudio.Workload.Python"
    ]
}