Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 29 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ curl -fsSL https://github.com/Devolutions/multi-pwsh/releases/latest/download/in
irm https://github.com/Devolutions/multi-pwsh/releases/latest/download/install-multi-pwsh.ps1 | iex
```

Install a specific tag (example `v0.13.0`):
Install a specific tag (example `v0.14.0`):

```bash
curl -fsSL https://github.com/Devolutions/multi-pwsh/releases/download/v0.13.0/install-multi-pwsh.sh | bash -s -- v0.13.0
curl -fsSL https://github.com/Devolutions/multi-pwsh/releases/download/v0.14.0/install-multi-pwsh.sh | bash -s -- v0.14.0
```

```powershell
& ([scriptblock]::Create((irm https://github.com/Devolutions/multi-pwsh/releases/download/v0.13.0/install-multi-pwsh.ps1))) -Version v0.13.0
& ([scriptblock]::Create((irm https://github.com/Devolutions/multi-pwsh/releases/download/v0.14.0/install-multi-pwsh.ps1))) -Version v0.14.0
```

Uninstall bootstrap scripts:
Expand Down Expand Up @@ -277,11 +277,35 @@ See [docs/host-and-venv.md](docs/host-and-venv.md) for host shims, local replace

## CLI NuGet package and AppHost mode

`Devolutions.MultiPwsh.Cli` packages RID-specific `multi-pwsh` binaries for .NET projects. It also includes opt-in MSBuild targets for downstream packages that need to copy `multi-pwsh` as a replacement apphost. AppHost mode is inert by default.
`Devolutions.MultiPwsh.Cli` packages RID-specific `multi-pwsh` binaries under `runtimes/<rid>/native/` for .NET projects. It also exposes neutral MSBuild metadata for downstream packages that need to consume the same binaries as PowerShell apphosts. The package supplies only the native launcher; downstream packages must place it beside their own `pwsh.dll` and `pwsh.runtimeconfig.json`.

Package authors can consume the launchers privately and map them into their own package layout:

```xml
<ItemGroup>
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.14.0" PrivateAssets="all" />
</ItemGroup>

<PropertyGroup>
<MultiPwshRuntimeNativeContentCopyEnabled>false</MultiPwshRuntimeNativeContentCopyEnabled>
</PropertyGroup>

<Target Name="StagePowerShellAppHosts" DependsOnTargets="ResolveMultiPwshAppHostAssets">
<ItemGroup>
<PowerShellSdkAppHost Include="@(MultiPwshAppHostAsset)">
<PackagePath>tools/apphost/%(RuntimeIdentifier)/%(AppHostFileName)</PackagePath>
</PowerShellSdkAppHost>
</ItemGroup>
</Target>
```

`@(MultiPwshAppHostAsset)` includes the source path as the item identity plus metadata such as `RuntimeIdentifier`, `NativeFileName`, `AppHostFileName`, `PackageRelativePath`, and `PackageId`. The package also sets `MultiPwshAppHostSupportedRuntimeIdentifiers` and `MultiPwshAppHostManifestPath`.

For a simple single-RID project, AppHost mode can copy the selected binary directly to build and publish output. AppHost mode is inert by default.

```xml
<ItemGroup>
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.13.0" PrivateAssets="all" />
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.14.0" PrivateAssets="all" />
</ItemGroup>

<PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion crates/multi-pwsh/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "multi-pwsh"
version = "0.13.0"
version = "0.14.0"
edition = "2018"
license = "MIT/Apache-2.0"
homepage = "https://github.com/Devolutions/multi-pwsh"
Expand Down
2 changes: 1 addition & 1 deletion crates/pwsh-host/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "pwsh-host"
version = "0.13.0"
version = "0.14.0"
edition = "2018"
license = "MIT/Apache-2.0"
homepage = "https://github.com/Devolutions/pwsh-host-rs"
Expand Down
2 changes: 1 addition & 1 deletion docs/host-and-venv.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ Typical downstream vendored-SDK usage:

```xml
<ItemGroup>
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.13.0" PrivateAssets="all" />
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.14.0" PrivateAssets="all" />
</ItemGroup>

<PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="ResolveMultiPwshAppHost" Condition="'$(MultiPwshAppHostEnabled)' == 'true'">
<Target Name="ResolveMultiPwshAppHostAssets">
<PropertyGroup>
<MultiPwshAppHostPackageRoot Condition="'$(MultiPwshAppHostPackageRoot)' == ''">$(MSBuildThisFileDirectory)..\</MultiPwshAppHostPackageRoot>
<MultiPwshAppHostRuntimeNativeRoot Condition="'$(MultiPwshAppHostRuntimeNativeRoot)' == ''">$(MultiPwshAppHostPackageRoot)runtimes\</MultiPwshAppHostRuntimeNativeRoot>
<MultiPwshAppHostManifestPath Condition="'$(MultiPwshAppHostManifestPath)' == ''">$(MultiPwshAppHostPackageRoot)build\Devolutions.MultiPwsh.Cli.AppHostManifest.json</MultiPwshAppHostManifestPath>
<MultiPwshAppHostSupportedRuntimeIdentifiers Condition="'$(MultiPwshAppHostSupportedRuntimeIdentifiers)' == ''">win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</MultiPwshAppHostSupportedRuntimeIdentifiers>
</PropertyGroup>

<ItemGroup>
<_MultiPwshAppHostAssetDefinition Include="win-x64;win-arm64">
<NativeFileName>multi-pwsh.exe</NativeFileName>
<AppHostFileName>pwsh.exe</AppHostFileName>
</_MultiPwshAppHostAssetDefinition>
<_MultiPwshAppHostAssetDefinition Include="linux-x64;linux-arm64;osx-x64;osx-arm64">
<NativeFileName>multi-pwsh</NativeFileName>
<AppHostFileName>pwsh</AppHostFileName>
</_MultiPwshAppHostAssetDefinition>

<MultiPwshAppHostAsset Include="$(MultiPwshAppHostRuntimeNativeRoot)%(_MultiPwshAppHostAssetDefinition.Identity)\native\%(_MultiPwshAppHostAssetDefinition.NativeFileName)"
Condition="Exists('$(MultiPwshAppHostRuntimeNativeRoot)%(_MultiPwshAppHostAssetDefinition.Identity)\native\%(_MultiPwshAppHostAssetDefinition.NativeFileName)')">
<RuntimeIdentifier>%(_MultiPwshAppHostAssetDefinition.Identity)</RuntimeIdentifier>
<NativeFileName>%(_MultiPwshAppHostAssetDefinition.NativeFileName)</NativeFileName>
<AppHostFileName>%(_MultiPwshAppHostAssetDefinition.AppHostFileName)</AppHostFileName>
<PackageRelativePath>runtimes/%(_MultiPwshAppHostAssetDefinition.Identity)/native/%(_MultiPwshAppHostAssetDefinition.NativeFileName)</PackageRelativePath>
<PackageId>Devolutions.MultiPwsh.Cli</PackageId>
</MultiPwshAppHostAsset>
</ItemGroup>
</Target>

<Target Name="ResolveMultiPwshAppHost"
DependsOnTargets="ResolveMultiPwshAppHostAssets"
Condition="'$(MultiPwshAppHostEnabled)' == 'true'">
<PropertyGroup>
<_MultiPwshAppHostResolvedRuntimeIdentifier Condition="'$(MultiPwshAppHostRuntimeIdentifier)' != ''">$(MultiPwshAppHostRuntimeIdentifier)</_MultiPwshAppHostResolvedRuntimeIdentifier>
<_MultiPwshAppHostResolvedRuntimeIdentifier Condition="'$(_MultiPwshAppHostResolvedRuntimeIdentifier)' == '' And '$(PowerShellSDKAppHostRuntimeIdentifier)' != ''">$(PowerShellSDKAppHostRuntimeIdentifier)</_MultiPwshAppHostResolvedRuntimeIdentifier>
Expand All @@ -18,14 +49,22 @@
<_MultiPwshAppHostOutputBaseName Condition="'$(_MultiPwshAppHostOutputBaseName)' == ''">multi-pwsh</_MultiPwshAppHostOutputBaseName>
<_MultiPwshAppHostOutputName Condition="'$(MultiPwshAppHostOutputName)' != ''">$(MultiPwshAppHostOutputName)</_MultiPwshAppHostOutputName>
<_MultiPwshAppHostOutputName Condition="'$(_MultiPwshAppHostOutputName)' == ''">$(_MultiPwshAppHostOutputBaseName)$(_MultiPwshAppHostExeSuffix)</_MultiPwshAppHostOutputName>
<MultiPwshAppHostResolvedNativeBinary>$(MSBuildThisFileDirectory)..\runtimes\$(_MultiPwshAppHostResolvedRuntimeIdentifier)\native\$(_MultiPwshAppHostNativeFileName)</MultiPwshAppHostResolvedNativeBinary>
</PropertyGroup>

<Error Condition="!Exists('$(MultiPwshAppHostResolvedNativeBinary)')"
Text="Devolutions.MultiPwsh.Cli does not contain a native binary for runtime identifier '$(_MultiPwshAppHostResolvedRuntimeIdentifier)' at '$(MultiPwshAppHostResolvedNativeBinary)'. Supported RIDs are win-x64, win-arm64, linux-x64, linux-arm64, osx-x64, and osx-arm64." />
<ItemGroup>
<_MultiPwshResolvedAppHostAsset Include="@(MultiPwshAppHostAsset)"
Condition="'%(MultiPwshAppHostAsset.RuntimeIdentifier)' == '$(_MultiPwshAppHostResolvedRuntimeIdentifier)'" />
</ItemGroup>

<Error Condition="'@(_MultiPwshResolvedAppHostAsset)' == ''"
Text="Devolutions.MultiPwsh.Cli does not contain a native binary for runtime identifier '$(_MultiPwshAppHostResolvedRuntimeIdentifier)'. Supported RIDs are $(MultiPwshAppHostSupportedRuntimeIdentifiers)." />

<PropertyGroup>
<MultiPwshAppHostResolvedNativeBinary>@(_MultiPwshResolvedAppHostAsset)</MultiPwshAppHostResolvedNativeBinary>
</PropertyGroup>

<ItemGroup>
<MultiPwshAppHostNativeBinary Include="$(MultiPwshAppHostResolvedNativeBinary)">
<MultiPwshAppHostNativeBinary Include="@(_MultiPwshResolvedAppHostAsset)">
<RuntimeIdentifier>$(_MultiPwshAppHostResolvedRuntimeIdentifier)</RuntimeIdentifier>
<OutputName>$(_MultiPwshAppHostOutputName)</OutputName>
</MultiPwshAppHostNativeBinary>
Expand Down
14 changes: 8 additions & 6 deletions nuget/Devolutions.MultiPwsh.Cli/Devolutions.MultiPwsh.Cli.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -19,27 +19,29 @@
<RepositoryType>git</RepositoryType>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<PackageReadmeFile>README.md</PackageReadmeFile>
<MultiPwshCliStagingRoot Condition="'$(MultiPwshCliStagingRoot)' == ''">$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh</MultiPwshCliStagingRoot>
</PropertyGroup>

<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\win-x64\multi-pwsh.exe" Pack="true" Condition="Exists('$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\win-x64\multi-pwsh.exe')">
<Content Include="$(MultiPwshCliStagingRoot)\win-x64\multi-pwsh.exe" Pack="true" Condition="Exists('$(MultiPwshCliStagingRoot)\win-x64\multi-pwsh.exe')">
<PackagePath>runtimes\win-x64\native\multi-pwsh.exe</PackagePath>
</Content>
<Content Include="$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\win-arm64\multi-pwsh.exe" Pack="true" Condition="Exists('$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\win-arm64\multi-pwsh.exe')">
<Content Include="$(MultiPwshCliStagingRoot)\win-arm64\multi-pwsh.exe" Pack="true" Condition="Exists('$(MultiPwshCliStagingRoot)\win-arm64\multi-pwsh.exe')">
<PackagePath>runtimes\win-arm64\native\multi-pwsh.exe</PackagePath>
</Content>
<Content Include="$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\linux-x64\multi-pwsh" Pack="true" Condition="Exists('$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\linux-x64\multi-pwsh')">
<Content Include="$(MultiPwshCliStagingRoot)\linux-x64\multi-pwsh" Pack="true" Condition="Exists('$(MultiPwshCliStagingRoot)\linux-x64\multi-pwsh')">
<PackagePath>runtimes\linux-x64\native</PackagePath>
</Content>
<Content Include="$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\linux-arm64\multi-pwsh" Pack="true" Condition="Exists('$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\linux-arm64\multi-pwsh')">
<Content Include="$(MultiPwshCliStagingRoot)\linux-arm64\multi-pwsh" Pack="true" Condition="Exists('$(MultiPwshCliStagingRoot)\linux-arm64\multi-pwsh')">
<PackagePath>runtimes\linux-arm64\native</PackagePath>
</Content>
<Content Include="$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\osx-x64\multi-pwsh" Pack="true" Condition="Exists('$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\osx-x64\multi-pwsh')">
<Content Include="$(MultiPwshCliStagingRoot)\osx-x64\multi-pwsh" Pack="true" Condition="Exists('$(MultiPwshCliStagingRoot)\osx-x64\multi-pwsh')">
<PackagePath>runtimes\osx-x64\native</PackagePath>
</Content>
<Content Include="$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\osx-arm64\multi-pwsh" Pack="true" Condition="Exists('$(MSBuildThisFileDirectory)..\..\artifacts\cli\multi-pwsh\osx-arm64\multi-pwsh')">
<Content Include="$(MultiPwshCliStagingRoot)\osx-arm64\multi-pwsh" Pack="true" Condition="Exists('$(MultiPwshCliStagingRoot)\osx-arm64\multi-pwsh')">
<PackagePath>runtimes\osx-arm64\native</PackagePath>
</Content>
<None Include="$(MultiPwshCliStagingRoot)\apphost-manifest.json" Pack="true" PackagePath="build\Devolutions.MultiPwsh.Cli.AppHostManifest.json" Condition="Exists('$(MultiPwshCliStagingRoot)\apphost-manifest.json')" />
<Content Include="Devolutions.MultiPwsh.Cli.targets" PackagePath="build\Devolutions.MultiPwsh.Cli.targets" Pack="true" />
<Content Include="Devolutions.MultiPwsh.Cli.props" PackagePath="buildTransitive\Devolutions.MultiPwsh.Cli.props" Pack="true" />
<Content Include="Devolutions.MultiPwsh.Cli.AppHost.targets" PackagePath="buildTransitive\Devolutions.MultiPwsh.Cli.targets" Pack="true" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,10 @@
<MultiPwshAppHostEnabled Condition="'$(MultiPwshAppHostEnabled)' == ''">false</MultiPwshAppHostEnabled>
<MultiPwshAppHostCopyToOutput Condition="'$(MultiPwshAppHostCopyToOutput)' == ''">true</MultiPwshAppHostCopyToOutput>
<MultiPwshAppHostCopyToPublish Condition="'$(MultiPwshAppHostCopyToPublish)' == ''">true</MultiPwshAppHostCopyToPublish>
<MultiPwshRuntimeNativeContentCopyEnabled Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == ''">true</MultiPwshRuntimeNativeContentCopyEnabled>
<MultiPwshAppHostPackageRoot Condition="'$(MultiPwshAppHostPackageRoot)' == ''">$(MSBuildThisFileDirectory)..\</MultiPwshAppHostPackageRoot>
<MultiPwshAppHostRuntimeNativeRoot Condition="'$(MultiPwshAppHostRuntimeNativeRoot)' == ''">$(MultiPwshAppHostPackageRoot)runtimes\</MultiPwshAppHostRuntimeNativeRoot>
<MultiPwshAppHostManifestPath Condition="'$(MultiPwshAppHostManifestPath)' == ''">$(MultiPwshAppHostPackageRoot)build\Devolutions.MultiPwsh.Cli.AppHostManifest.json</MultiPwshAppHostManifestPath>
<MultiPwshAppHostSupportedRuntimeIdentifiers Condition="'$(MultiPwshAppHostSupportedRuntimeIdentifiers)' == ''">win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</MultiPwshAppHostSupportedRuntimeIdentifiers>
</PropertyGroup>
</Project>
16 changes: 10 additions & 6 deletions nuget/Devolutions.MultiPwsh.Cli/Devolutions.MultiPwsh.Cli.targets
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Condition="'$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'win-x64'">
<PropertyGroup>
<MultiPwshRuntimeNativeContentCopyEnabled Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == ''">true</MultiPwshRuntimeNativeContentCopyEnabled>
</PropertyGroup>

<ItemGroup Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == 'true' And ('$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'win-x64')">
<Content Include="$(MSBuildThisFileDirectory)..\runtimes\win-x64\native\multi-pwsh.exe" Condition="Exists('$(MSBuildThisFileDirectory)..\runtimes\win-x64\native\multi-pwsh.exe')">
<Link>runtimes\win-x64\native\multi-pwsh.exe</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand All @@ -10,7 +14,7 @@
</Content>
</ItemGroup>

<ItemGroup Condition="'$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'win-arm64'">
<ItemGroup Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == 'true' And ('$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'win-arm64')">
<Content Include="$(MSBuildThisFileDirectory)..\runtimes\win-arm64\native\multi-pwsh.exe" Condition="Exists('$(MSBuildThisFileDirectory)..\runtimes\win-arm64\native\multi-pwsh.exe')">
<Link>runtimes\win-arm64\native\multi-pwsh.exe</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand All @@ -21,7 +25,7 @@
</Content>
</ItemGroup>

<ItemGroup Condition="'$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'linux-x64'">
<ItemGroup Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == 'true' And ('$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'linux-x64')">
<Content Include="$(MSBuildThisFileDirectory)..\runtimes\linux-x64\native\multi-pwsh" Condition="Exists('$(MSBuildThisFileDirectory)..\runtimes\linux-x64\native\multi-pwsh')">
<Link>runtimes\linux-x64\native\multi-pwsh</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand All @@ -32,7 +36,7 @@
</Content>
</ItemGroup>

<ItemGroup Condition="'$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'linux-arm64'">
<ItemGroup Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == 'true' And ('$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'linux-arm64')">
<Content Include="$(MSBuildThisFileDirectory)..\runtimes\linux-arm64\native\multi-pwsh" Condition="Exists('$(MSBuildThisFileDirectory)..\runtimes\linux-arm64\native\multi-pwsh')">
<Link>runtimes\linux-arm64\native\multi-pwsh</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand All @@ -43,7 +47,7 @@
</Content>
</ItemGroup>

<ItemGroup Condition="'$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'osx-x64'">
<ItemGroup Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == 'true' And ('$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'osx-x64')">
<Content Include="$(MSBuildThisFileDirectory)..\runtimes\osx-x64\native\multi-pwsh" Condition="Exists('$(MSBuildThisFileDirectory)..\runtimes\osx-x64\native\multi-pwsh')">
<Link>runtimes\osx-x64\native\multi-pwsh</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand All @@ -54,7 +58,7 @@
</Content>
</ItemGroup>

<ItemGroup Condition="'$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'osx-arm64'">
<ItemGroup Condition="'$(MultiPwshRuntimeNativeContentCopyEnabled)' == 'true' And ('$(RuntimeIdentifier)' == '' Or '$(RuntimeIdentifier)' == 'osx-arm64')">
<Content Include="$(MSBuildThisFileDirectory)..\runtimes\osx-arm64\native\multi-pwsh" Condition="Exists('$(MSBuildThisFileDirectory)..\runtimes\osx-arm64\native\multi-pwsh')">
<Link>runtimes\osx-arm64\native\multi-pwsh</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand Down
26 changes: 24 additions & 2 deletions nuget/Devolutions.MultiPwsh.Cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,33 @@

`Devolutions.MultiPwsh.Cli` ships RID-specific `multi-pwsh` native binaries for .NET projects. It also includes opt-in AppHost MSBuild targets for projects that need to copy the same binary as a PowerShell replacement apphost.

The normal CLI payload is copied under `runtimes/<rid>/native/` for build and publish outputs. AppHost mode is inert by default; set `MultiPwshAppHostEnabled=true` to copy the selected RID binary as `multi-pwsh`, `pwsh`, or another explicit file name.
The normal CLI payload is copied under `runtimes/<rid>/native/` for build and publish outputs. Package authors can disable that content copy and consume neutral apphost metadata instead:

```xml
<ItemGroup>
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.13.0" PrivateAssets="all" />
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.14.0" PrivateAssets="all" />
</ItemGroup>

<PropertyGroup>
<MultiPwshRuntimeNativeContentCopyEnabled>false</MultiPwshRuntimeNativeContentCopyEnabled>
</PropertyGroup>

<Target Name="StagePowerShellAppHosts" DependsOnTargets="ResolveMultiPwshAppHostAssets">
<ItemGroup>
<PowerShellSdkAppHost Include="@(MultiPwshAppHostAsset)">
<PackagePath>tools/apphost/%(RuntimeIdentifier)/%(AppHostFileName)</PackagePath>
</PowerShellSdkAppHost>
</ItemGroup>
</Target>
```

`@(MultiPwshAppHostAsset)` includes the source path as the item identity plus `RuntimeIdentifier`, `NativeFileName`, `AppHostFileName`, `PackageRelativePath`, and `PackageId` metadata. The package also provides `MultiPwshAppHostSupportedRuntimeIdentifiers` and `MultiPwshAppHostManifestPath`.

AppHost mode is inert by default; set `MultiPwshAppHostEnabled=true` to copy the selected RID binary as `multi-pwsh`, `pwsh`, or another explicit file name.

```xml
<ItemGroup>
<PackageReference Include="Devolutions.MultiPwsh.Cli" Version="0.14.0" PrivateAssets="all" />
</ItemGroup>

<PropertyGroup>
Expand Down
Loading
Loading