成功 dotnet 发布后缺少包

Posted

技术标签:

【中文标题】成功 dotnet 发布后缺少包【英文标题】:Packages are missing after a successful dotnet publish 【发布时间】:2019-06-26 14:37:38 【问题描述】:

发布命令工作正常,但运行后,我必须恢复项目,因为缺少包...

所以如果我运行以下命令:

dotnet publish --runtime win-x64

然后发布工作,但我的项目中缺少包。

但是如果我在没有运行时的情况下运行发布:

dotnet 发布

然后发布工作正常,我没有任何丢失的包。

这是正常行为吗?我能做些什么来解决这个问题?这很烦人。

这是我的 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
    <LangVersion>7.1</LangVersion>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="AWSSDK.Extensions.NETCore.Setup">
        <Version>3.3.6</Version>
    </PackageReference>
    <PackageReference Include="Microsoft.AspNetCore.App">
    </PackageReference>
    <PackageReference Include="Microsoft.AspNetCore.StaticFiles">
        <Version>2.1.1</Version>
    </PackageReference>
    <PackageReference Include="NSwag.AspNetCore">
        <Version>12.0.13</Version>
    </PackageReference>
    <PackageReference Include="NSwag.MSBuild">
        <Version>12.0.13</Version>
    </PackageReference>
</ItemGroup>
<ItemGroup>
    <ProjectReference Include="..\MyProject.Analytics\MyProject.Analytics.csproj" />
    <ProjectReference Include="..\MyProject.ApiClient\MyProject.ApiClient.csproj" />
    <ProjectReference Include="..\MyProject.CommonApi\MyProject.CommonApi.csproj" />
    <ProjectReference Include="..\MyProject.Common\MyProject.Common.csproj" />
    <ProjectReference Include="..\MyProject.DbAccess\MyProject.DbAccess.csproj" />
    <ProjectReference Include="..\MyProject.Logging\MyProject.Logging.csproj" />
    <ProjectReference Include="..\MyProject.Messaging\MyProject.Messaging.csproj" />
    <ProjectReference Include="..\MyProject.Model\MyProject.Model.csproj" />
    <ProjectReference Include="..\MyProject.Settings\MyProject.Settings.csproj" />
</ItemGroup>
<ItemGroup>
    <Content Update="appsettings.Api.Development.json">
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update="appsettings.Api.json">
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update="appsettings.Api.Production.json">
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include=".ebextensions\never-sleep-again.config">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Update="appsettings.Api.PreProduction.json">
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>
<ItemGroup>
  <Folder Include="MyProjectlogs\Development" />
</ItemGroup>
<ItemGroup>
    <ProjectCapability Include="SourceItemsFromImports" />
</ItemGroup>
<Target Name="NSwag" AfterTargets="Build">
    <Copy SourceFiles="@(Reference)" DestinationFolder="$(OutDir)References" />
    <Exec Command="$(NSwagExe_Core21) run nswag.json /variables" />
    <RemoveDir Directories="$(OutDir)References" />
</Target>

编辑:从还原 nugets 日志中,我获得了我发布的项目的每个依赖项的以下内容

@   Project 'MyProject.Api' is affected (InstallCount = 0)

所以它实际上认为有些东西不同,但似乎没有安装任何东西。

【问题讨论】:

您的项目中是否有 32 位依赖项?如果您将 64 位作为目标,我猜这些将不会发布 我该如何检查?我只添加了掘金。 缺少什么 dll?你能分享minimal complete example吗?我创建了一个新的 mvc 应用程序,添加了相同的包引用,并发布了它对我来说看起来不错。 查看问题中编辑的 nuget 还原日志,似乎没有“安装”任何东西。我真的对这个问题感到困惑。 【参考方案1】:

四处挖掘,我找到了this post。

有趣的部分是:

restore 和 build 可以作为另一个命令的一部分隐式运行, 喜欢发布。当作为另一个命令的一部分隐式运行时,它们是 提供额外的上下文,以便正确的工件 产生。当您使用运行时发布时(例如,dotnet publish -r linux-x64),隐式恢复为 linux-x64 运行时恢复包。如果显式调用 restore ,它不会恢复 默认情况下运行时包,因为它没有那个上下文。

基本上,我在运行时 .netcore 2.1.1 与还原版本 2.1.X (X != 1) 之间存在不匹配。

解决方案(在上面的链接中解释)是将其添加到项目文件中:

<PropertyGroup>
    ...
    <RuntimeIdentifiers>win-x64</RuntimeIdentifiers>
    <TargetLatestRuntimePatch>true</TargetLatestRuntimePatch>
</PropertyGroup>

【讨论】:

以上是关于成功 dotnet 发布后缺少包的主要内容,如果未能解决你的问题,请参考以下文章

dotnet.exe 无法运行,因为缺少 api-ms-win-crt-runtime-l1-1-0.dll

服务器不重启安装Asp.net Core 程序包

dotnet publish 在预发布完成之前运行

在 Visual Studio 16.6 中将仅内容包导入 DotNet Core 3.1 项目

安装 dotnet ef 成功,但调用时遇到错误

即使在安装 .NET 核心 SDK 后,Dotnet 命令也不起作用