Further reduce number of generated VS profiles (#11489)
This commit reduces the number of generated VS profiles from 6 down to just 2 per VS instance. The reason we did this is out of concern of overwhelming or annoying new users with too many profiles. Especially since it's far easier at the moment to add new generators compared to removing them. As before only the latest instance is not hidden by default. ## PR Checklist * [x] I work here * [x] Tests added/passed * [x] As discussed in a Team Sync meeting ## Validation Steps Performed * Installed Visual Studio 2019 and 2022 Preview * A profile for both is generated, while the 2019 one is hidden by default ✔️ * $env:VSCMD_ARG_TGT_ARCH is x64 on my AMD64 machine ✔️
This commit is contained in:
parent
284257a383
commit
5a23029dac
|
@ -14,7 +14,6 @@
|
|||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
|
||||
<!-- ========================= Headers ======================== -->
|
||||
<ItemGroup>
|
||||
<ClInclude Include="VcDevCmdGenerator.h" />
|
||||
<ClInclude Include="VisualStudioGenerator.h" />
|
||||
<ClInclude Include="DefaultTerminal.h">
|
||||
<DependentUpon>DefaultTerminal.idl</DependentUpon>
|
||||
|
@ -85,7 +84,6 @@
|
|||
</ItemGroup>
|
||||
<!-- ========================= Cpp Files ======================== -->
|
||||
<ItemGroup>
|
||||
<ClCompile Include="VcDevCmdGenerator.cpp" />
|
||||
<ClCompile Include="VisualStudioGenerator.cpp" />
|
||||
<ClCompile Include="DefaultTerminal.cpp">
|
||||
<DependentUpon>DefaultTerminal.idl</DependentUpon>
|
||||
|
@ -267,4 +265,4 @@
|
|||
</Target>
|
||||
<Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" />
|
||||
<Import Project="..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets" Condition="Exists('..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets')" />
|
||||
</Project>
|
||||
</Project>
|
||||
|
|
|
@ -46,9 +46,6 @@
|
|||
<ClCompile Include="VsSetupConfiguration.cpp">
|
||||
<Filter>profileGeneration</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="VcDevCmdGenerator.cpp">
|
||||
<Filter>profileGeneration</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="pch.h" />
|
||||
|
@ -95,9 +92,6 @@
|
|||
<ClInclude Include="VsSetupConfiguration.h">
|
||||
<Filter>profileGeneration</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="VcDevCmdGenerator.h">
|
||||
<Filter>profileGeneration</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Midl Include="ActionArgs.idl" />
|
||||
|
@ -129,4 +123,4 @@
|
|||
<UniqueIdentifier>{81a6314f-aa5b-4533-a499-13bc3a5c4af0}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
|
|
@ -1,94 +0,0 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
#include "pch.h"
|
||||
#include "DynamicProfileUtils.h"
|
||||
#include "VcDevCmdGenerator.h"
|
||||
|
||||
using namespace winrt::Microsoft::Terminal::Settings::Model;
|
||||
|
||||
void VcDevCmdGenerator::GenerateProfiles(const VsSetupConfiguration::VsSetupInstance& instance, bool hidden, std::vector<winrt::com_ptr<implementation::Profile>>& profiles) const
|
||||
{
|
||||
try
|
||||
{
|
||||
const std::filesystem::path root{ GetVcCmdScriptDirectory(instance) };
|
||||
if (!std::filesystem::exists(root))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// x64 environments only installed on 64-bit machines.
|
||||
#ifdef _WIN64
|
||||
const auto vcvars64 = root / L"vcvars64.bat";
|
||||
if (std::filesystem::exists(vcvars64))
|
||||
{
|
||||
auto profile = CreateProfile(instance, L"x64", vcvars64, hidden);
|
||||
profiles.emplace_back(std::move(profile));
|
||||
|
||||
// Only the VC environment for the matching architecture should be shown by default.
|
||||
hidden = true;
|
||||
}
|
||||
|
||||
const auto vcvarsamd64_x86 = root / L"vcvarsamd64_x86.bat";
|
||||
if (std::filesystem::exists(vcvarsamd64_x86))
|
||||
{
|
||||
auto profile = CreateProfile(instance, L"x64_x86", vcvarsamd64_x86, true);
|
||||
profiles.emplace_back(std::move(profile));
|
||||
}
|
||||
|
||||
const auto vcvarsx86_amd64 = root / L"vcvarsx86_amd64.bat";
|
||||
if (std::filesystem::exists(vcvarsx86_amd64))
|
||||
{
|
||||
auto profile = CreateProfile(instance, L"x86_x64", vcvarsx86_amd64, true);
|
||||
profiles.emplace_back(std::move(profile));
|
||||
}
|
||||
#endif // _WIN64
|
||||
|
||||
const auto vcvars32 = root / L"vcvars32.bat";
|
||||
if (std::filesystem::exists(vcvars32))
|
||||
{
|
||||
auto profile = CreateProfile(instance, L"x86", vcvars32, hidden);
|
||||
profiles.emplace_back(std::move(profile));
|
||||
}
|
||||
}
|
||||
CATCH_LOG();
|
||||
}
|
||||
|
||||
winrt::com_ptr<implementation::Profile> VcDevCmdGenerator::CreateProfile(const VsSetupConfiguration::VsSetupInstance& instance, const std::wstring_view& prefix, const std::filesystem::path& path, bool hidden) const
|
||||
{
|
||||
const auto seed = GetProfileGuidSeed(instance, path);
|
||||
const winrt::guid profileGuid{ ::Microsoft::Console::Utils::CreateV5Uuid(TERMINAL_PROFILE_NAMESPACE_GUID, gsl::as_bytes(gsl::make_span(seed))) };
|
||||
|
||||
auto profile = winrt::make_self<implementation::Profile>(profileGuid);
|
||||
profile->Name(winrt::hstring{ GetProfileName(instance, prefix) });
|
||||
profile->Commandline(winrt::hstring{ GetProfileCommandLine(path) });
|
||||
profile->StartingDirectory(winrt::hstring{ instance.GetInstallationPath() });
|
||||
profile->Icon(winrt::hstring{ GetProfileIconPath() });
|
||||
profile->Hidden(hidden);
|
||||
|
||||
return profile;
|
||||
}
|
||||
|
||||
std::wstring VcDevCmdGenerator::GetProfileGuidSeed(const VsSetupConfiguration::VsSetupInstance& instance, const std::filesystem::path& path) const
|
||||
{
|
||||
return L"VsDevCmd" + instance.GetInstanceId() + path.native();
|
||||
}
|
||||
|
||||
std::wstring VcDevCmdGenerator::GetProfileName(const VsSetupConfiguration::VsSetupInstance& instance, const std::wstring_view& prefix) const
|
||||
{
|
||||
std::wstring name{ prefix + L" Native Tools Command Prompt for VS " };
|
||||
name.append(instance.GetProfileNameSuffix());
|
||||
return name;
|
||||
}
|
||||
|
||||
std::wstring VcDevCmdGenerator::GetProfileCommandLine(const std::filesystem::path& path) const
|
||||
{
|
||||
std::wstring commandLine{ L"cmd.exe /k \"" + path.native() + L"\"" };
|
||||
|
||||
return commandLine;
|
||||
}
|
||||
|
||||
std::wstring VcDevCmdGenerator::GetVcCmdScriptDirectory(const VsSetupConfiguration::VsSetupInstance& instance) const
|
||||
{
|
||||
return instance.ResolvePath(L"VC\\Auxiliary\\Build\\");
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/*++
|
||||
Copyright (c) Microsoft Corporation
|
||||
Licensed under the MIT license.
|
||||
|
||||
Module Name:
|
||||
- VcDevCmdGenerator
|
||||
|
||||
Abstract:
|
||||
- Dynamic profile generator for Visual C++ development environments.
|
||||
|
||||
Author(s):
|
||||
- Heath Stewart - September 2021
|
||||
|
||||
--*/
|
||||
|
||||
#pragma once
|
||||
#include "VisualStudioGenerator.h"
|
||||
#include "VsSetupConfiguration.h"
|
||||
|
||||
namespace winrt::Microsoft::Terminal::Settings::Model
|
||||
{
|
||||
class VcDevCmdGenerator final : public VisualStudioGenerator::IVisualStudioProfileGenerator
|
||||
{
|
||||
public:
|
||||
void GenerateProfiles(const VsSetupConfiguration::VsSetupInstance& instance, bool hidden, std::vector<winrt::com_ptr<implementation::Profile>>& profiles) const override;
|
||||
|
||||
private:
|
||||
winrt::com_ptr<implementation::Profile> CreateProfile(const VsSetupConfiguration::VsSetupInstance& instance, const std::wstring_view& prefix, const std::filesystem::path& path, bool hidden) const;
|
||||
|
||||
std::wstring GetProfileIconPath() const
|
||||
{
|
||||
return L"ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png";
|
||||
}
|
||||
|
||||
std::wstring GetProfileGuidSeed(const VsSetupConfiguration::VsSetupInstance& instance, const std::filesystem::path& path) const;
|
||||
std::wstring GetProfileName(const VsSetupConfiguration::VsSetupInstance& instance, const std::wstring_view& prefix) const;
|
||||
std::wstring GetProfileCommandLine(const std::filesystem::path& path) const;
|
||||
std::wstring GetVcCmdScriptDirectory(const VsSetupConfiguration::VsSetupInstance& instance) const;
|
||||
};
|
||||
};
|
|
@ -4,7 +4,6 @@
|
|||
#include "pch.h"
|
||||
#include "DynamicProfileUtils.h"
|
||||
#include "VisualStudioGenerator.h"
|
||||
#include "VcDevCmdGenerator.h"
|
||||
#include "VsDevCmdGenerator.h"
|
||||
#include "VsDevShellGenerator.h"
|
||||
|
||||
|
@ -20,7 +19,6 @@ void VisualStudioGenerator::GenerateProfiles(std::vector<winrt::com_ptr<implemen
|
|||
const auto instances = VsSetupConfiguration::QueryInstances();
|
||||
|
||||
VsDevCmdGenerator devCmdGenerator;
|
||||
VcDevCmdGenerator vcCmdGenerator;
|
||||
VsDevShellGenerator devShellGenerator;
|
||||
|
||||
// Instances are ordered from latest to oldest. Hide all but the profiles for the latest instance.
|
||||
|
@ -28,9 +26,7 @@ void VisualStudioGenerator::GenerateProfiles(std::vector<winrt::com_ptr<implemen
|
|||
for (auto const& instance : instances)
|
||||
{
|
||||
devCmdGenerator.GenerateProfiles(instance, hidden, profiles);
|
||||
vcCmdGenerator.GenerateProfiles(instance, hidden, profiles);
|
||||
devShellGenerator.GenerateProfiles(instance, hidden, profiles);
|
||||
|
||||
hidden = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,8 +38,15 @@ std::wstring VsDevCmdGenerator::GetProfileName(const VsSetupConfiguration::VsSet
|
|||
|
||||
std::wstring VsDevCmdGenerator::GetProfileCommandLine(const VsSetupConfiguration::VsSetupInstance& instance) const
|
||||
{
|
||||
std::wstring commandLine{ L"cmd.exe /k \"" + GetDevCmdScriptPath(instance) + L"\"" };
|
||||
|
||||
std::wstring commandLine;
|
||||
commandLine.reserve(256);
|
||||
commandLine.append(LR"("cmd.exe /k ")");
|
||||
commandLine.append(GetDevCmdScriptPath(instance));
|
||||
#if defined(_M_ARM64)
|
||||
commandLine.append(LR"(" -arch=arm64 -host_arch=x64)");
|
||||
#elif defined(_M_AMD64)
|
||||
commandLine.append(LR"(" -arch=x64 -host_arch=x64)");
|
||||
#endif
|
||||
return commandLine;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,10 +42,19 @@ std::wstring VsDevShellGenerator::GetProfileCommandLine(const VsSetupConfigurati
|
|||
// The triple-quotes are a PowerShell path escape sequence that can safely be stored in a JSON object.
|
||||
// The "SkipAutomaticLocation" parameter will prevent "Enter-VsDevShell" from automatically setting the shell path
|
||||
// so the path in the profile will be used instead.
|
||||
std::wstring commandLine{ L"powershell.exe -NoExit -Command \"& {" };
|
||||
commandLine.append(L"Import-Module \"\"\"" + GetDevShellModulePath(instance) + L"\"\"\";");
|
||||
commandLine.append(L"Enter-VsDevShell " + instance.GetInstanceId() + L" -SkipAutomaticLocation");
|
||||
commandLine.append(L"}\"");
|
||||
std::wstring commandLine;
|
||||
commandLine.reserve(256);
|
||||
commandLine.append(LR"(powershell.exe -NoExit -Command "&{Import-Module """)");
|
||||
commandLine.append(GetDevShellModulePath(instance));
|
||||
commandLine.append(LR"("""; Enter-VsDevShell )");
|
||||
commandLine.append(instance.GetInstanceId());
|
||||
#if defined(_M_ARM64)
|
||||
commandLine.append(LR"( -SkipAutomaticLocation -DevCmdArguments """-arch=arm64 -host_arch=x64"""}")");
|
||||
#elif defined(_M_AMD64)
|
||||
commandLine.append(LR"( -SkipAutomaticLocation -DevCmdArguments """-arch=x64 -host_arch=x64"""}")");
|
||||
#else
|
||||
commandLine.append(LR"( -SkipAutomaticLocation}")");
|
||||
#endif
|
||||
|
||||
return commandLine;
|
||||
}
|
||||
|
|
|
@ -21,17 +21,11 @@ std::vector<VsSetupConfiguration::VsSetupInstance> VsSetupConfiguration::QueryIn
|
|||
wil::com_ptr<IEnumSetupInstances> e;
|
||||
THROW_IF_FAILED(pQuery->EnumInstances(&e));
|
||||
|
||||
ComPtrSetupInstance rgpInstance;
|
||||
auto result = e->Next(1, &rgpInstance, nullptr);
|
||||
while (S_OK == result)
|
||||
for (ComPtrSetupInstance rgpInstance; S_OK == THROW_IF_FAILED(e->Next(1, &rgpInstance, nullptr));)
|
||||
{
|
||||
// wrap the COM pointers in a friendly interface
|
||||
instances.emplace_back(VsSetupInstance{ pQuery, rgpInstance });
|
||||
result = e->Next(1, &rgpInstance, nullptr);
|
||||
instances.emplace_back(pQuery, std::move(rgpInstance));
|
||||
}
|
||||
|
||||
THROW_IF_FAILED(result);
|
||||
|
||||
// Sort instances based on version and install date from latest to oldest.
|
||||
std::sort(instances.begin(), instances.end(), [](const VsSetupInstance& a, const VsSetupInstance& b) {
|
||||
auto const aVersion = a.GetComparableVersion();
|
||||
|
@ -123,7 +117,7 @@ std::wstring VsSetupConfiguration::GetStringProperty(ISetupPropertyStore* pProps
|
|||
}
|
||||
|
||||
wil::unique_variant var;
|
||||
if (FAILED(pProps->GetValue(name.data(), &var)))
|
||||
if (FAILED(pProps->GetValue(name.data(), &var)) || var.vt != VT_BSTR)
|
||||
{
|
||||
return std::wstring{};
|
||||
}
|
||||
|
|
|
@ -56,12 +56,12 @@ namespace winrt::Microsoft::Terminal::Settings::Model
|
|||
return VsSetupConfiguration::GetInstallationVersion(inst.get());
|
||||
}
|
||||
|
||||
unsigned long long GetComparableInstallDate() const
|
||||
unsigned long long GetComparableInstallDate() const noexcept
|
||||
{
|
||||
return installDate;
|
||||
}
|
||||
|
||||
unsigned long long GetComparableVersion() const
|
||||
unsigned long long GetComparableVersion() const noexcept
|
||||
{
|
||||
return version;
|
||||
}
|
||||
|
@ -114,9 +114,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model
|
|||
return profileNameSuffix;
|
||||
}
|
||||
|
||||
private:
|
||||
friend class VsSetupConfiguration;
|
||||
|
||||
VsSetupInstance(ComPtrSetupQuery pQuery, ComPtrSetupInstance pInstance) :
|
||||
query(pQuery), // Copy and AddRef the query object.
|
||||
inst(std::move(pInstance)), // Take ownership of the instance object.
|
||||
|
@ -126,6 +123,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model
|
|||
{
|
||||
}
|
||||
|
||||
private:
|
||||
ComPtrSetupQuery query;
|
||||
ComPtrSetupInstance inst;
|
||||
|
||||
|
|
Loading…
Reference in a new issue