在dotnet发布后,其他探测路径不受尊重?

时间:2018-02-06 19:15:35

标签: .net .net-core .net-core-2.0

我在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个文件的文件夹中所需的(和工作)输出。

published folder

现在,我想要做的是将所有大部分文件移到子文件夹中,例如lib。

Moved most of the stuff into lib

根据我收集的内容,在runtimeconfig.json中设置additionalProbingPaths should work:

{
  "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)也不起作用。

我错过了什么吗?该功能被删除了吗?它看起来并不像source code still contains it

1 个答案:

答案 0 :(得分:0)

  

尝试创建上述结构并移动文件

好像您在lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll中有targets/Microsoft.AspNetCore.Antiforgery/2.0.1/runtime,在"path": "microsoft.aspnetcore.antiforgery/2.0.1"中有libraies/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文件夹(常规文件夹)-已执行App.exe(App.dll)的文件夹; SCD的默认设置。
  • Framework文件夹(常规文件夹)-仅适用于Framework Dependent Deployment ,例如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将创建所有资产的列表-每个依赖项程序包的“运行时”和“本机”属性中的库。

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

一旦找不到DLL,它将检查Additional Probing Paths是否存在。

这次,由于Additional Probing Path被认为是NuGet缓存,因此它期望存在某个子文件夹结构。 具体来说,它将从Package Name节中提取Version"libraries",并结合"path"(或"runtime")节中的"native"和DLL路径。 / p>

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