dotnet publish后additionalProbingPaths没有被识别?

9

我正在Windows上使用dotnet 2.1.4版本。运行dotnet --info命令显示:

.NET Command Line Tools (2.1.4)

Product Information:
 Version:            2.1.4
 Commit SHA-1 hash:  5e8add2190

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.16299
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\2.1.4\

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.5
  Build    : 17373eb129b3b05aa18ece963f8795d65ef8ea54

我正在使用dotnet publish来创建一个平台的输出:
dotnet publish ..\src\ChestnutDS.Host\ChestnutDS.Host.csproj
     -c Release -o ..\..\published\win-x64
     --self-contained -r win-x64 -v n

这让我在一个包含323个文件的文件夹中得到了期望(且有效)的输出。

发布的文件夹

现在,我想将大部分文件移动到一个子文件夹中,例如 lib。

将大部分东西移动到lib中

根据我的了解,在 runtimeconfig.json 中设置 additionalProbingPaths 应该可以实现:

{
  "runtimeOptions": {
    "additionalProbingPaths": [
      "lib"
    ]
  }
}

但它抱怨找不到库:
Error:
  An assembly specified in the application dependencies manifest (ChestnutDS.Host.deps.json) was not found:
    package: 'Microsoft.AspNetCore.Antiforgery', version: '2.0.1'
    path: 'lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll'

尝试将--additionalProbingPath作为命令行参数传递也无法工作,出现相同的错误。尝试创建上述结构并移动文件(lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll),也不起作用。我错过了什么吗?该功能被删除了吗?看起来不是这样,源代码仍包含它

进一步研究后,我发现我还需要在.deps.json文件中进行更改,但我还没有找到正确的设置组合来使其工作。 - Michael Stum
我想做的是将大部分文件移动到子文件夹中,还是全部移动? - NightOwl888
@NightOwl888 除了被执行的程序和一些数据文件(例如上面提到的config.json、database.xml),我能够提供的只有我绝对需要的内容。其他所有东西都应该放在子文件夹中。 - Michael Stum
@MichaelStum,你在这方面有进展吗? - Waescher
@MichaelStum,你得到答案了吗? - RPrashant
1个回答

0
尝试创建所述结构并移动文件。
看起来您在targets/Microsoft.AspNetCore.Antiforgery/2.0.1/runtime中有lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll,并且在libraies/Microsoft.AspNetCore.Antiforgery/2.0.1条目中有"path": "microsoft.aspnetcore.antiforgery/2.0.1"。在这种情况下,预期的结构将是<additional probing path>/Microsoft.AspNetCore.Antiforgery/2.0.1/lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll
有两种类型的源文件夹,其中hostpolicy.dll正在搜索依赖库(*.dll*.ni.dll):
  • 普通文件夹(文件存在于文件夹的根目录,“路径”被省略)
  • NuGet缓存(针对每个依赖项条目具有特定子文件夹结构 <PackageName>/<Version>/<DllPath>,默认情况下会生成*.deps.json以满足此约定)

这些文件夹中搜索依赖项:

  • 应用程序文件夹(普通文件夹)- 执行 App.exe(App.dll)的文件夹;SCD的默认位置。
  • 框架文件夹(普通文件夹)- 仅适用于框架相关部署,例如 C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.1.4\
  • 探测路径(NuGet缓存)。

假设我们有这个App.deps.json(自包含部署)

"targets": {
    "runtime.win-x64.Microsoft.NETCore.App/2.0.0": {
        "runtime": {
              "foo/Microsoft.CSharp.dll": {},  // <========
        }
    }
}

"libraries": {
    "runtime.win-x64.Microsoft.NETCore.App/2.0.0": {
      "type": "package",
      "serviceable": true,
      "sha512": "sha512-8jivXDJLuJTxMQuInZaMiD2VbxehFmYAtn2V9mj9juaR5jH54/OBGmGv6SrIUVNqASXB/8dJbce/beIKnOzroQ==",
      "path": "bar", // <========
      "hashPath": "runtime.win-x64.microsoft.netcore.app.2.0.0.nupkg.sha512"
    }
}

首先,hostpolicy.dll 将创建一个所有资产的列表 - 来自每个依赖包的 "runtime" 和 "native" 属性的库。

接下来,它必须创建一个 TPA(可信平台程序集)列表,其中包含每个资产的绝对路径。为此,它将首先在应用程序文件夹中搜索 <app folder path>\Microsoft.CSharp.dll注意,对于这个特定的文件夹,它将省略 "path")。

一旦未找到 DLL,它将检查是否有任何 Additional Probing Paths

这次,由于 Additional Probing Path 被认为是 NuGet 缓存,因此它期望存在某些子文件夹结构。 具体来说,它将从 "libraries" 部分获取 Package NameVersion,并将其与 "runtime"(或 "native")部分中的 DLL 路径结合使用 "path"

因此,对于 Microsoft.CSharp.dll,探测路径将是 <Additional Probing Path>/bar/foo/Microsoft.CSharp.dll


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接