mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-08-29 01:59:34 +02:00
## Summary of the Pull Request Adds a native C++ multi-call shim that exposes existing PowerToys CLIs through `PATH`. The shims are installed under the PowerToys `bin` subfolder and follow the `PowerToys.<ModuleName>.CLI.exe` naming convention. The launcher preserves the raw argument tail, shares the caller's console, and returns the target process exit code. | PATH-visible command | Target executable | | --- | --- | | `PowerToys.FancyZones.CLI.exe` | `FancyZonesCLI.exe` | | `PowerToys.ImageResizer.CLI.exe` | `WinUI3Apps/PowerToys.ImageResizerCLI.exe` | | `PowerToys.FileLocksmith.CLI.exe` | `FileLocksmithCLI.exe` | | `PowerToys.PowerDisplay.CLI.exe` | `WinUI3Apps/PowerToys.PowerDisplay.Cli.exe` | proof of this work: <img width="1044" height="294" alt="image" src="https://github.com/user-attachments/assets/b659c552-5c08-4430-85c3-eba48f286eb0" /> <img width="1137" height="244" alt="image" src="https://github.com/user-attachments/assets/5fed493f-dc30-428d-a618-bf612ccf3635" /> <img width="1727" height="868" alt="image" src="https://github.com/user-attachments/assets/5c32fd2e-4a3a-4138-b968-fb5434eebec3" /> ## PR Checklist - [x] Closes: #48634 - [x] **Communication:** Discussed with core contributors in this PR - [x] **Tests:** Added/updated and all pass - [ ] **Localization:** CLI diagnostic messages are not localized - [x] **Dev docs:** Updated CLI naming and installation conventions - [x] **New binaries:** Added on the required places - [x] Signing JSON - [x] WiX installer entries - [x] CI builds through `PowerToys.slnx`; no dedicated YML step is required - [x] The existing release pipeline covers the solution and installer - [x] **Documentation updated:** `doc/devdocs/cli-conventions.md` ## Detailed Description of the Pull Request / Additional comments - Uses one native launcher binary for all commands and resolves the target from the invoked shim filename. - Installs PATH-visible shims under `PowerToys\bin`. - Keeps the existing module CLI binaries and their deployment locations unchanged. - Rejects the previous unsuffixed and `*cli` command aliases. ## Validation Steps Performed - Built `tools/CliShim.UnitTests/CliShim.UnitTests.vcxproj` in `Release|x64`: 0 warnings, 0 errors. - Ran `CliShim.UnitTests.dll` with `vstest.console.exe`: 5/5 tests passed. - Verified the CLI manifest, WiX command names, and `bin` installation directory are synchronized. - Ran `git diff --check`. --------- Co-authored-by: Yu Leng <yuleng@microsoft.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d11c4221-248f-44a9-85fb-7017ed43f4ce
185 lines
10 KiB
XML
185 lines
10 KiB
XML
<Project Sdk="WixToolset.Sdk/5.0.2">
|
|
<Import Project="..\..\src\CmdPalVersion.props" Condition="Exists('..\..\src\CmdPalVersion.props')" />
|
|
<PropertyGroup>
|
|
<EnableDefaultCompileItems>false</EnableDefaultCompileItems>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<DscModuleVersionSuffix Condition="$([System.Text.RegularExpressions.Regex]::IsMatch('$(Version)', '^\d+\.\d+\.\d+$'))">.0</DscModuleVersionSuffix>
|
|
<DscModuleVersionSuffix Condition="'$(DscModuleVersionSuffix)' == ''"></DscModuleVersionSuffix>
|
|
<DscModuleVersion>$(Version)$(DscModuleVersionSuffix)</DscModuleVersion>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Platform)' == 'x64'">
|
|
<DefineConstants>Version=$(Version);DscModuleVersion=$(DscModuleVersion);MonacoSRCHarvestPath=$(ProjectDir)..\..\x64\$(Configuration)\Assets\Monaco\monacoSRC;CmdPalVersion=$(CmdPalVersion)</DefineConstants> <!-- THIS IS AN INNER LOOP OPTIMIZATION
|
|
The build pipeline builds the Settings and Launcher projects for Publication
|
|
using a specific profile. If you're doing local installer builds, this will
|
|
simulate the build pipeline doing that for you. -->
|
|
<PreBuildEvent>IF NOT DEFINED IsPipeline (
|
|
call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=amd64 -host_arch=amd64 -winsdk=10.0.19041.0 -vcvars_ver=$(VCToolsVersion)
|
|
SET PTRoot=$(SolutionDir)\..
|
|
call "..\..\..\publish.cmd" x64
|
|
)
|
|
call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuildThisFileDirectory)\generateMonacoWxs.ps1 -monacoWxsFile "$(MSBuildThisFileDirectory)\MonacoSRC.wxs" -Platform "$(Platform)" -nugetHeatPath "$(NUGET_PACKAGES)\wixtoolset.heat\5.0.2"
|
|
</PreBuildEvent>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(Platform)' != 'x64'">
|
|
<DefineConstants>Version=$(Version);DscModuleVersion=$(DscModuleVersion);MonacoSRCHarvestPath=$(ProjectDir)..\..\ARM64\$(Configuration)\Assets\Monaco\monacoSRC;CmdPalVersion=$(CmdPalVersion)</DefineConstants>
|
|
<PreBuildEvent>IF NOT DEFINED IsPipeline (
|
|
call "$([MSBuild]::GetVsInstallRoot())\Common7\Tools\VsDevCmd.bat" -arch=arm64 -host_arch=amd64 -winsdk=10.0.19041.0 -vcvars_ver=$(VCToolsVersion)
|
|
SET PTRoot=$(SolutionDir)\..
|
|
call "..\..\..\publish.cmd" arm64
|
|
)
|
|
call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuildThisFileDirectory)\generateMonacoWxs.ps1 -monacoWxsFile "$(MSBuildThisFileDirectory)\MonacoSRC.wxs" -Platform "$(Platform)" -nugetHeatPath "$(NUGET_PACKAGES)\wixtoolset.heat\5.0.2"
|
|
</PreBuildEvent>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<RunPostBuildEvent>Always</RunPostBuildEvent>
|
|
<PostBuildEvent>
|
|
call move /Y ..\..\..\AdvancedPaste.wxs.bk ..\..\..\AdvancedPaste.wxs
|
|
call move /Y ..\..\..\Awake.wxs.bk ..\..\..\Awake.wxs
|
|
call move /Y ..\..\..\BaseApplications.wxs.bk ..\..\..\BaseApplications.wxs
|
|
call move /Y ..\..\..\CmdPal.wxs.bk ..\..\..\CmdPal.wxs
|
|
call move /Y ..\..\..\ColorPicker.wxs.bk ..\..\..\ColorPicker.wxs
|
|
call move /Y ..\..\..\Core.wxs.bk ..\..\..\Core.wxs
|
|
call move /Y ..\..\..\DscResources.wxs.bk ..\..\..\DscResources.wxs
|
|
call move /Y ..\..\..\EnvironmentVariables.wxs.bk ..\..\..\EnvironmentVariables.wxs
|
|
call move /Y ..\..\..\FileExplorerPreview.wxs.bk ..\..\..\FileExplorerPreview.wxs
|
|
call move /Y ..\..\..\FileLocksmith.wxs.bk ..\..\..\FileLocksmith.wxs
|
|
call move /Y ..\..\..\Hosts.wxs.bk ..\..\..\Hosts.wxs
|
|
call move /Y ..\..\..\LightSwitch.wxs.bk ..\..\..\LightSwitch.wxs
|
|
call move /Y ..\..\..\ImageResizer.wxs.bk ..\..\..\ImageResizer.wxs
|
|
call move /Y ..\..\..\KeyboardManager.wxs.bk ..\..\..\KeyboardManager.wxs
|
|
call move /Y ..\..\..\MouseWithoutBorders.wxs.bk ..\..\..\MouseWithoutBorders.wxs
|
|
call move /Y ..\..\..\NewPlus.wxs.bk ..\..\..\NewPlus.wxs
|
|
call move /Y ..\..\..\Peek.wxs.bk ..\..\..\Peek.wxs
|
|
call move /Y ..\..\..\PowerRename.wxs.bk ..\..\..\PowerRename.wxs
|
|
call move /Y ..\..\..\PowerDisplay.wxs.bk ..\..\..\PowerDisplay.wxs
|
|
call move /Y ..\..\..\Product.wxs.bk ..\..\..\Product.wxs
|
|
call move /Y ..\..\..\RegistryPreview.wxs.bk ..\..\..\RegistryPreview.wxs
|
|
call move /Y ..\..\..\Resources.wxs.bk ..\..\..\Resources.wxs
|
|
call move /Y ..\..\..\Run.wxs.bk ..\..\..\Run.wxs
|
|
call move /Y ..\..\..\Settings.wxs.bk ..\..\..\Settings.wxs
|
|
call move /Y ..\..\..\ShortcutGuide.wxs.bk ..\..\..\ShortcutGuide.wxs
|
|
call move /Y ..\..\..\Tools.wxs.bk ..\..\..\Tools.wxs
|
|
call move /Y ..\..\..\WinAppSDK.wxs.bk ..\..\..\WinAppSDK.wxs
|
|
call move /Y ..\..\..\WinUI3Applications.wxs.bk ..\..\..\WinUI3Applications.wxs
|
|
call move /Y ..\..\..\Workspaces.wxs.bk ..\..\..\Workspaces.wxs
|
|
</PostBuildEvent>
|
|
</PropertyGroup>
|
|
<PropertyGroup Condition="'$(RunBuildEvents)'=='false'">
|
|
<PostBuildEvent></PostBuildEvent>
|
|
<RunPostBuildEvent></RunPostBuildEvent>
|
|
<PreBuildEventUseInBuild>false</PreBuildEventUseInBuild>
|
|
<PostBuildEventUseInBuild>false</PostBuildEventUseInBuild>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(PerUser)' == 'true' ">
|
|
<DefineConstants>$(DefineConstants);PerUser=true</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(PerUser)' != 'true' ">
|
|
<DefineConstants>$(DefineConstants);PerUser=false</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(CIBuild)' == 'true' ">
|
|
<DefineConstants>$(DefineConstants);CIBuild=true</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup Label="UserMacros" Condition=" '$(CIBuild)' != 'true' ">
|
|
<DefineConstants>$(DefineConstants);CIBuild=false</DefineConstants>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<Name>PowerToysVNextInstaller</Name>
|
|
<!-- We do not support debug installer builds -->
|
|
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
|
|
<Platform>$(Platform)</Platform>
|
|
<ProductVersion>3.10</ProductVersion>
|
|
<ProjectGuid>{b6e94700-df38-41f6-a3fd-18b69674ab1e}</ProjectGuid>
|
|
<SchemaVersion>2.0</SchemaVersion>
|
|
<OutputName Condition=" '$(PerUser)' != 'true' ">PowerToysSetup-$(Version)-$(Platform)</OutputName>
|
|
<OutputName Condition=" '$(PerUser)' == 'true' ">PowerToysUserSetup-$(Version)-$(Platform)</OutputName>
|
|
<OutputType>Package</OutputType>
|
|
<SuppressAclReset>True</SuppressAclReset>
|
|
<NuGetPackageImportStamp>
|
|
</NuGetPackageImportStamp>
|
|
<!-- 1076 and ICE91 - warning: using this configuration for perMachine install could cause problems. -->
|
|
<!-- 1026 - warning: file ID is too long -->
|
|
<SuppressIces>ICE91</SuppressIces>
|
|
<SuppressSpecificWarnings>1026;1076</SuppressSpecificWarnings>
|
|
</PropertyGroup>
|
|
<PropertyGroup>
|
|
<OutputPath Condition=" '$(PerUser)' != 'true' ">$(Platform)\$(Configuration)\MachineSetup</OutputPath>
|
|
<OutputPath Condition=" '$(PerUser)' == 'true' ">$(Platform)\$(Configuration)\UserSetup</OutputPath>
|
|
<IntermediateOutputPath Condition=" '$(PerUser)' != 'true' ">$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\MachineSetup</IntermediateOutputPath>
|
|
<IntermediateOutputPath Condition=" '$(PerUser)' == 'true' ">$(BaseIntermediateOutputPath)$(Platform)\$(Configuration)\UserSetup</IntermediateOutputPath>
|
|
<SuppressIces>ICE40</SuppressIces>
|
|
</PropertyGroup>
|
|
<ItemGroup>
|
|
<Compile Include="CustomDialogs\PTInstallDirDlg.wxs" />
|
|
<Compile Include="CustomDialogs\PTLicenseDlg.wxs" />
|
|
<Compile Include="CustomDialogs\WixUI_PTInstallDir.wxs" />
|
|
<Compile Include="NewPlus.wxs" />
|
|
<Compile Include="Product.wxs" />
|
|
<Compile Include="AdvancedPaste.wxs" />
|
|
<Compile Include="Awake.wxs" />
|
|
<Compile Include="BaseApplications.wxs" />
|
|
<Compile Include="CmdPal.wxs" />
|
|
<Compile Include="ColorPicker.wxs" />
|
|
<Compile Include="EnvironmentVariables.wxs" />
|
|
<Compile Include="FileExplorerPreview.wxs" />
|
|
<Compile Include="FileLocksmith.wxs" />
|
|
<Compile Include="Hosts.wxs" />
|
|
<Compile Include="ImageResizer.wxs" />
|
|
<Compile Include="LightSwitch.wxs" />
|
|
<Compile Include="KeyboardManager.wxs" />
|
|
<Compile Include="Peek.wxs" />
|
|
<Compile Include="PowerRename.wxs" />
|
|
<Compile Include="PowerDisplay.wxs" />
|
|
<Compile Include="DscResources.wxs" />
|
|
<Compile Include="RegistryPreview.wxs" />
|
|
<Compile Include="Run.wxs" />
|
|
<Compile Include="Settings.wxs" />
|
|
<Compile Include="ShortcutGuide.wxs" />
|
|
<Compile Include="Tools.wxs" />
|
|
<Compile Include="CliShims.wxs" />
|
|
<Compile Include="MouseWithoutBorders.wxs" />
|
|
<Compile Include="WinUI3Applications.wxs" />
|
|
<Compile Include="MonacoSRC.wxs" />
|
|
<Compile Include="Core.wxs" />
|
|
<Compile Include="Resources.wxs" />
|
|
<Compile Include="WinAppSDK.wxs" />
|
|
<Compile Include="Workspaces.wxs" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<Folder Include="CustomDialogs" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<PackageReference Include="WixToolset.Heat" />
|
|
<PackageReference Include="WixToolset.Firewall.wixext" />
|
|
<PackageReference Include="WixToolset.Util.wixext" />
|
|
<PackageReference Include="WixToolset.UI.wixext" />
|
|
<PackageReference Include="WixToolset.NetFx.wixext" />
|
|
<PackageReference Include="WixToolset.Bal.wixext" />
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<ProjectReference Include="..\PowerToysSetupCustomActionsVNext\PowerToysSetupCustomActionsVNext.vcxproj">
|
|
<Name>PowerToysSetupCustomActionsVNext</Name>
|
|
<Project>{B3A354B0-1E54-4B55-A962-FB5AF9330C19}</Project>
|
|
<Private>True</Private>
|
|
<DoNotHarvest>True</DoNotHarvest>
|
|
<RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
|
|
<RefTargetDir>INSTALLFOLDER</RefTargetDir>
|
|
</ProjectReference>
|
|
</ItemGroup>
|
|
<ItemGroup>
|
|
<Content Include="packages.config" />
|
|
</ItemGroup>
|
|
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
|
<PropertyGroup>
|
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
|
</PropertyGroup>
|
|
</Target>
|
|
<!-- Prevents NU1503 -->
|
|
<Target Name="_IsProjectRestoreSupported" Returns="@(_ValidProjectsForRestore)">
|
|
<ItemGroup>
|
|
<_ValidProjectsForRestore Include="$(MSBuildProjectFullPath)" />
|
|
</ItemGroup>
|
|
</Target>
|
|
<Target Name="Restore" />
|
|
</Project>
|