【发布时间】:2019-12-11 19:17:39
【问题描述】:
我在 .NET Core 中创建了一个 PowerShell 二进制模块(TargetFramework 是 netstandard2.0)。当我在 Windows 机器上使用 Import-Module 时,模块导入成功,我可以调用 cmdlet。当我在 Linux 容器上执行相同操作时(我使用的是官方的 Microsoft PowerShell 容器映像 - mcr.microsoft.com/powershell:ubuntu-18.04),模块导入时不会出错,但我无法调用 cmdlet。如果我运行 Get-Module,Linux 容器上没有列出导出命令,但我的 Windows 机器上有。
PowerShell 模块的项目是使用dotnet new powershell 初始化的。我尝试添加一个 psd1 清单文件,我还初始化了一个新项目并重复了上述步骤。使用 dotnet new 创建的基础项目也会出现同样的问题。
我正在运行 dotnet 版本 2.2.103。运行 dotnet new powershell 会创建一个带有如下 csproj 文件的项目:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>demo_psmodule</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PowerShellStandard.Library" Version="5.1.0-preview-06">
<PrivateAssets>All</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>
示例项目有一个类:
[Cmdlet(VerbsDiagnostic.Test,"SampleCmdlet")]
[OutputType(typeof(FavoriteStuff))]
public class TestSampleCmdletCommand : PSCmdlet
{
// cmdlet parameters and code
}
我希望该模块能够像在 Windows 机器上那样在 linux 容器上导出 cmdlet。我需要改变什么来实现这一点?
更新 问题在于我用来构建容器的 dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /src
COPY [ "demo-psmodule.csproj", "src/" ]
RUN dotnet restore "src/demo-psmodule.csproj"
COPY . .
RUN dotnet publish "src/demo-psmodule.csproj" -c Release -o /app/demo_psmodule
FROM mcr.microsoft.com/powershell:ubuntu-18.04 AS app
WORKDIR /app
COPY --from=build /app .
【问题讨论】:
标签: c# linux powershell docker .net-core