Skip to content

Commit f59f089

Browse files
committed
Installer: add alternative way to specify Visual Studio location
1 parent d057bed commit f59f089

File tree

6 files changed

+67
-9
lines changed

6 files changed

+67
-9
lines changed

src/VsixTesting.Installer/Program.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,34 @@ internal class Program : MarshalByRefObject
2525
[STAThread]
2626
public static int Main(string[] args)
2727
{
28-
var applicationPath = CommandLineParser.One(args, "ApplicationPath");
28+
var applicationPath = CommandLineParser.One(args, "ApplicationPath", string.Empty);
2929
var rootSuffix = CommandLineParser.One(args, "RootSuffix", string.Empty);
30+
31+
if (string.IsNullOrEmpty(applicationPath))
32+
{
33+
var version = CommandLineParser.One(args, "Version");
34+
var sku = CommandLineParser.One(args, "SKU", string.Empty);
35+
var preview = CommandLineParser.Contains(args, "Preview");
36+
var installations = VisualStudioUtil.FindInstallations();
37+
38+
applicationPath = GetInstallation(installations, version, sku, preview)?.ApplicationPath
39+
?? throw new Exception($"Cannot find any Visual Studio Instance.");
40+
}
41+
3042
var appDomain = CreateAppDomain(applicationPath);
3143
var program = appDomain.CreateInstanceFromAndUnwrap<Program>();
3244
return program.Run(applicationPath, rootSuffix, args);
3345
}
3446

47+
internal static VsInstallation GetInstallation(IEnumerable<VsInstallation> installations, string version, string sku, bool preview)
48+
{
49+
return installations.
50+
Where(i => i.Version.Major == VersionRange.Parse(version).Minimum.Major)
51+
.OrderByDescending(i => i.ProductId.Split('.').Last().Equals(sku, StringComparison.OrdinalIgnoreCase))
52+
.ThenByDescending(i => i.Preview == preview)
53+
.FirstOrDefault();
54+
}
55+
3556
private int Run(string applicationPath, string rootSuffix, string[] args)
3657
{
3758
try

src/VsixTesting.Installer/Properties/launchSettings.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@
1818
},
1919
"VsixTesting.Installer.2012.Install": {
2020
"commandName": "Project",
21-
"commandLineArgs": "/ApplicationPath \"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\IDE\\devenv.exe\" /RootSuffix Exp /Install \"$(SolutionDir)bin\\VsixTesting.Invoker\\$(Configuration)\\net452\\VsixTesting.Invoker.vsix\""
21+
"commandLineArgs": "/Version 2012 /RootSuffix Exp /Install \"$(SolutionDir)bin\\VsixTesting.Invoker\\$(Configuration)\\net452\\VsixTesting.Invoker.vsix\""
2222
},
2323
"VsixTesting.Installer.2012.InstallAndStart": {
2424
"commandName": "Project",
25-
"commandLineArgs": "/ApplicationPath \"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\IDE\\devenv.exe\" /RootSuffix Exp /InstallAndStart \"$(SolutionDir)bin\\VsixTesting.Invoker\\$(Configuration)\\net452\\VsixTesting.Invoker.vsix\""
25+
"commandLineArgs": "/Version 2012 /RootSuffix Exp /InstallAndStart \"$(SolutionDir)bin\\VsixTesting.Invoker\\$(Configuration)\\net452\\VsixTesting.Invoker.vsix\""
2626
},
2727
"VsixTesting.Installer.2012.Uninstall": {
2828
"commandName": "Project",
29-
"commandLineArgs": "/ApplicationPath \"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\IDE\\devenv.exe\" /RootSuffix Exp /Uninstall 9eef3d53-333f-4be2-900e-a1f104fc325a"
29+
"commandLineArgs": "/Version 2012 /RootSuffix Exp /Uninstall 9eef3d53-333f-4be2-900e-a1f104fc325a"
3030
},
3131
"VsixTesting.Installer.2012.IsProfileInitialized": {
3232
"commandName": "Project",
33-
"commandLineArgs": "/ApplicationPath \"C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\Common7\\IDE\\devenv.exe\" /RootSuffix Exp /IsProfileInitialized"
34-
}
33+
"commandLineArgs": "/Version 2012 /RootSuffix Exp /IsProfileInitialized"
34+
},
3535
}
3636
}

src/VsixTesting.Xunit/Internal/VsTestCaseFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ internal static IEnumerable<VsInstallation> FilterInstallations(IEnumerable<VsIn
9191
{
9292
foreach (var installation in group
9393
.OrderBy(i => !i.ApplicationPath.Equals(preferedAppPath, StringComparison.OrdinalIgnoreCase))
94-
.ThenBy(i => i.Name.Contains("-pre")))
94+
.ThenBy(i => i.Preview))
9595
{
9696
if (!settings.SupportedVersionRanges.Any(range => installation.Version >= range.Minimum && installation.Version <= range.Maximum))
9797
{

src/VsixTesting/Vs/VisualStudioUtil.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ namespace Vs
77
using System.Diagnostics;
88
using System.IO;
99
using System.Linq;
10-
using System.Reflection;
1110
using System.Runtime.InteropServices;
1211
using System.Threading.Tasks;
1312
using Common;
1413
using EnvDTE80;
1514
using Microsoft.VisualStudio.Setup.Configuration;
1615
using Microsoft.Win32;
17-
using VsixTesting.Utilities;
1816
using DTE = EnvDTE.DTE;
1917

2018
internal static partial class VisualStudioUtil
@@ -129,6 +127,7 @@ public static IEnumerable<VsInstallation> FindInstallations()
129127
path: instance.GetInstallationPath())
130128
{
131129
PackageIds = instance.GetPackages().Select(p => p.GetId()),
130+
ProductId = instance.GetProduct().GetId(),
132131
};
133132
}
134133
}

src/VsixTesting/Vs/VsInstallation.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ public VsInstallation(Version version, string path, string name)
1616
}
1717

1818
public Version Version { get; }
19+
public bool Preview => Name.Contains("-pre");
1920
public string Path { get; }
2021
public string Name { get; }
22+
public string ProductId { get; set; } = string.Empty;
2123
public string ApplicationPath => VisualStudioUtil.GetApplicationPath(Path);
2224
public IEnumerable<string> PackageIds { get; set; } = Enumerable.Empty<string>();
2325
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2018 Jose Torres. All rights reserved. Licensed under the Apache License, Version 2.0. See LICENSE.md file in the project root for full license information.
2+
3+
namespace VsixTesting.Installer.Tests
4+
{
5+
using System;
6+
using Vs;
7+
using Xunit;
8+
9+
public class ProgramTests
10+
{
11+
private const string CommunityId = "Microsoft.VisualStudio.Product.Community";
12+
private const string ProfessionalId = "Microsoft.VisualStudio.Product.Professional";
13+
private const string EnterpriseId = "Microsoft.VisualStudio.Product.Enterprise";
14+
15+
[Theory]
16+
[InlineData("2017", null, false, CommunityId)]
17+
[InlineData("15.0", null, false, CommunityId)]
18+
[InlineData("15", null, false, CommunityId)]
19+
[InlineData("2017", null, true, ProfessionalId)]
20+
[InlineData("2017", "Community", false, CommunityId)]
21+
[InlineData("2017", "Community", true, CommunityId)]
22+
[InlineData("2017", "Professional", false, ProfessionalId)]
23+
[InlineData("2017", "Professional", true, ProfessionalId)]
24+
void GetInstallation(string version, string sku, bool preview, string expected)
25+
{
26+
var installations = new[]
27+
{
28+
new VsInstallation(new Version(15, 0), string.Empty, "VisualStudio/15.0.0") { ProductId = CommunityId },
29+
new VsInstallation(new Version(15, 0), string.Empty, "VisualStudio/15.0.0-pre.1.0+27729.1") { ProductId = ProfessionalId },
30+
new VsInstallation(new Version(15, 1), string.Empty, "VisualStudio/15.0.1") { ProductId = EnterpriseId },
31+
};
32+
33+
Assert.Equal(expected, Program.GetInstallation(installations, version, sku, preview).ProductId);
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)