2016-11-28 292 views
23

我正在TeamCity上設置ASP.NET Core項目。它構建的二進制文件在其他機器上啓動時崩潰。該錯誤消息表明它正在尋找只存在於構建服務器上的路徑中的dll。 DotPeek顯示在.exe中有一個名爲myproject.deps.json的嵌入式資源文件。在那裏的目標部分,有對使用絕對路徑的dll的引用。這意味着ASP.NET Core二進制文件只能在它們所在的機器上運行。什麼是deps.json,以及如何使它使用相對路徑?

我該如何解決這個問題?這個文件是什麼,我如何使用相對路徑?經過一番挖掘,看起來路徑來自project.fragment.lock.json,這是一個生成的文件。如果我編輯它以使用相對路徑,則該文件將被重新覆蓋。什麼會產生這種情況,以及如何修復或停止?

對於那些誰問,project.json樣子:

{ 
    "dependencies": { 
    "CommandLineParser": "1.9.71", 
    "Microsoft.AspNetCore.Mvc": "1.0.0", 
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", 
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", 
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0", 
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0", 
    "Microsoft.Extensions.Configuration.Json": "1.0.0", 
    "Microsoft.Extensions.Logging": "1.0.0", 
    "Microsoft.Extensions.Logging.Console": "1.0.0", 
    "Microsoft.Extensions.Logging.Debug": "1.0.0", 
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", 
    "System.Configuration.Abstractions": "1.0.0" 
    }, 

    "tools": { 
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" 
    }, 

    "frameworks": { 
    "net461": { 
     "dependencies": { 
     "Company.Common": { 
      "target": "project" 
     }, 
     "Company.Integration": { 
      "target": "project" 
     }, 
     "Company.Functions": { 
      "target": "project" 
     }, 
     "Company.Utils": { 
      "target": "project" 
     } 
     } 
    } 
    }, 

    "buildOptions": { 
    "emitEntryPoint": true, 
    "preserveCompilationContext": true 
    }, 

    "publishOptions": { 
    "include": [ 
     "wwwroot", 
     "Views", 
     "Areas/**/Views", 
     "appsettings.json", 
     "web.config" 
    ] 
    }, 

    "scripts": { 
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] 
    } 
} 
+0

那些絕對路徑引用是第三方庫? – Evk

+0

@Evk他們中的一些人,其他人是參考室內圖書館。 – TarkaDaal

+0

TeamCity是安裝在您的機器上還是在單獨的服務器上? dotnet版本是最新的? deps.json的哪一部分包含圖書館的路徑 - 你能比較一下本地 - 構建一個並向我們展示一些差異嗎? – Dmitry

回答

13

回答你的第一個問題,每Runtime Configuration File Documentation:

而且回答你的第二個問題,是刪除刪除preserveCompilationContext在你的project.json文件(和重建)中。

MyApp.deps.json是依賴列表,以及編制方面的數據和編譯的依賴。技術上不需要,但需要使用服務或程序包緩存/共享程序包安裝功能。

根據您對Dimitry的評論,我無法分辨您是否在您的目標機器上安裝了.net核心,因此推斷出您嘗試執行的部署類型。但假設它已安裝,您應該能夠調整您的myproject.runtime.json以解決您的問題。如果你不這樣做,我強烈建議閱讀這兩種不同類型的.NET Core Application Deployment:

可以爲.NET核心應用創建兩種類型的部署:

框架相關的部署。顧名思義, 依賴於框架的部署(FDD)依賴於目標系統上存在的.NET Core共享系統範圍的版本。因爲.NET已經存在,所以您的應用程序也可以在安裝.NET Core的 之間移植。您的應用只包含自己的代碼和不在.NET Core 庫之外的任何第三方依賴項。 FDD包含。dll文件,可以通過使用 dotnet實用程序從命令行啓動。例如,dotnet app.dll運行一個名爲app的應用程序 。

獨立部署。與FDD不同,自包含的部署 (SCD)不依賴任何共享組件出現在 目標系統上。所有組件(包括.NET Core庫和.NET Core運行時)都包含在該應用程序中,並且與其他.NET Core應用程序隔離。 SCD包含一個可執行文件 (例如Windows平臺上用於名爲app的應用程序的app.exe), ,它是平臺特定的.NET Core主機的更名版本, 和.dll文件(如app.dll) ,這是實際的應用。

+0

我在磁盤上沒有'myapp.deps.json'。它是由(我假設)VS自動生成的,並嵌入到應用程序中。 – TarkaDaal

+2

@TarkaDaal如果你想擺脫你的程序集中的myproject.deps.json,你可以在你的project.json文件(和重建)中刪除preserveCompilationContext。 – ciriarte

+0

@ciriate就是這樣!讓這個答案,你可以得到賞金。 – TarkaDaal

6

*.deps.json來自preserveCompilationContext

保留編譯上下文對於運行時編譯(即即時編譯)非常有用,尤其適用於編譯視圖。它對圖書館通常不是有用的。解決您的問題:

  1. 從您的應用引用的每個Company.*庫中刪除preserveCompilationContext
  2. 如果這不起作用,請從您的主應用中刪除preserveCompilationContext

有一種參與對話的位置:https://github.com/aspnet/Mvc/issues/5141

3

如果您使用的是較新的.csproj格式

<TargetFramework>標籤解決了該問題對我來說下增加<PreserveCompilationContext>false</PreserveCompilationContext>

<PropertyGroup> <TargetFramework>netcoreapp1.1</TargetFramework> <PreserveCompilationContext>false</PreserveCompilationContext> </PropertyGroup>