在 Linux 上构建 ASP.Net Core 部署包

jos*_*osh 11 c# linux msbuild msdeploy asp.net-core

我正在尝试在 .net 核心 sdk docker 映像上构建一个 web 部署包,用于部署到运行 iis 的 windows 服务器(部署在单独的 windows vm 上完成)。这是我正在运行的命令(这也可以通过 Visual Studio 中的发布 UI 完成):

dotnet publish src/SpaceForce.sln -c release -o out -p:WebPublishMethod=Package;PackageAsSingleFile=True;DesktopBuildPackageLocation="../Package/SpaceForce.WebAPI.zip"
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,这会生成一个包含以下文件的文件夹,然后当我准备好部署时,我只需运行 cmd 文件:

SpaceForce.WebAPI.deploy.cmd
SpaceForce.WebAPI.deploy-readme.txt
SpaceForce.WebAPI.Parameters.xml
SpaceForce.WebAPI.SetParameters.xml
SpaceForce.WebAPI.SourceManifest.xml
SpaceForce.WebAPI.zip
Run Code Online (Sandbox Code Playgroud)

但在 Linux (.net core sdk docker image) 上,它会产生以下错误:

/usr/share/dotnet/sdk/3.1.300/Sdks/Microsoft.NET.Sdk.Publish/targets/PublishTargets/Microsoft.NET.Sdk.Publish.MSDeployPackage.targets(97,5): error MSB6004: The specified task executable location "%ProgramW6432%/IIS/Microsoft Web Deploy V3/msdeploy.exe" is invalid. [/home/osboxes/src/spaceforce/src/SpaceForce.WebAPI/SpaceForce.WebAPI.csproj]
Run Code Online (Sandbox Code Playgroud)

此页面上,它有此注释,但我不确定这是否适用于我的情况:

dotnet msbuild命令是一个跨平台命令,可以在 macOS 和 Linux 上编译 ASP.NET Core 应用程序。但是,macOS 和 Linux 上的 MSBuild 无法将应用程序部署到 Azure 或其他 MSDeploy 终结点。

如果我可以在 linux 上构建,我很乐意在 Windows 机器上运行 cmd 文件进行部署。是否可以在 linux 上构建这个包?

Hee*_*aaw 3

正如你所引用的,MSDeploy这是一个仅限 Windows 的东西。使用WebPublishMethod开关尝试运行"%ProgramW6432%/IIS/Microsoft Web Deploy V3/msdeploy.exe",这显然不存在于 Linux 容器中。

要将应用程序从 Linux 环境发布到 IIS 服务器,您必须发布不带 WebDeploy 特定功能的应用程序,然后将发布的文件发送到 IIS 服务器。在服务器上,您可以使用一组物理路径配置应用程序,并将已发布的文件移动到该路径中。

要从 docker 映像获取文件,您必须创建一个临时容器并复制文件

# Dockerfile
RUN dotnet publish src/SpaceForce.sln -c Release -f netcoreapp3.1 -o /out
Run Code Online (Sandbox Code Playgroud)
# bash script to get the publish dir from the image
imageId=$(docker create <IMAGE_NAME>)
docker cp $imageId:/out/ <HOST_DIR>
docker rm $imageId
Run Code Online (Sandbox Code Playgroud)

这篇文章应该可以帮助您入门。

希望这有一点帮助