web-dev-qa-db-de.com

Was ist deps.json und wie verwende ich relative Pfade?

Ich richte ein ASP.NET Core-Projekt in TeamCity ein. Die Binärdateien, die es erstellt, stürzen beim Starten auf anderen Computern ab. Die Fehlermeldung zeigt an, dass nach DLLs in Pfaden gesucht wird, die nur auf dem Buildserver vorhanden sind. DotPeek zeigt, dass die EXE-Datei eine eingebettete Ressourcendatei mit dem Namen myproject.deps.json Enthält. Im Abschnitt "Ziele" gibt es Verweise auf DLLs, die absolute Pfade verwenden. Dies bedeutet, dass ASP.NET Core-Binärdateien immer nur auf dem Computer ausgeführt werden, auf dem sie erstellt wurden.

Wie behebe ich dieses Problem? Was ist diese Datei und wie verwende ich relative Pfade? Nach einigem Graben sieht es so aus, als ob die Pfade von project.fragment.lock.json Stammen, einer generierten Datei. Wenn ich dies bearbeite, um relative Pfade zu verwenden, wird die Datei nur erneut überschrieben. Was erzeugt dies und wie kann es behoben oder gestoppt werden?

Für diejenigen, die gefragt haben, sieht project.json Folgendermaßen aus:

{
  "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%" ]
  }
}
35
TarkaDaal

Die Antwort auf Ihre erste Frage finden Sie in der Runtime Configuration File Documentation:

Und die Antwort auf Ihre zweite Frage lautet: Entfernen preserveCompilationContext in Ihrer project.json-Datei entfernen (und neu erstellen).

MyApp.deps.json ist eine Liste von Abhängigkeiten sowie Kompilierungskontextdaten und Kompilierungsabhängigkeiten. Nicht technisch erforderlich, aber erforderlich, um die Funktionen für die Wartung oder den Paket-Cache/die gemeinsame Paketinstallation zu verwenden.

Anhand Ihres Kommentars zu Dimitry konnte ich nicht erkennen, ob auf Ihrem Zielcomputer ein .NET-Core installiert ist, und daher auf die Art der Bereitstellung schließen, die Sie ausführen möchten. Vorausgesetzt, es ist installiert, sollten Sie in der Lage sein, Ihr myproject.runtime.json zu optimieren, um Ihre Probleme zu beheben. Sollte dies nicht der Fall sein, empfehle ich dringend, die beiden verschiedenen Arten von . NET Core Application Deployment: zu lesen

Sie können zwei Arten von Bereitstellungen für .NET Core-Anwendungen erstellen:

Framework-abhängige Bereitstellung . Wie der Name schon sagt, setzt die Framework-abhängige Bereitstellung (FDD) eine gemeinsam genutzte systemweite Version von .NET Core voraus, die auf dem Zielsystem vorhanden sein muss. Da .NET Core bereits vorhanden ist, ist Ihre App auch zwischen Installationen von .NET Core portierbar. Ihre App enthält nur ihren eigenen Code und alle Abhängigkeiten von Drittanbietern, die sich außerhalb der .NET Core-Bibliotheken befinden. FDDs enthalten DLL-Dateien, die mit dem Dienstprogramm dotnet über die Befehlszeile gestartet werden können. Beispielsweise führt dotnet app.dll eine Anwendung mit dem Namen app aus.

Eigenständige Bereitstellung . Im Gegensatz zu FDD erfordert eine eigenständige Bereitstellung (SCD) keine gemeinsam genutzten Komponenten, die auf dem Zielsystem vorhanden sind. Alle Komponenten, einschließlich der .NET Core-Bibliotheken und der .NET Core-Laufzeit, sind in der Anwendung enthalten und von anderen .NET Core-Anwendungen isoliert. SCDs enthalten eine ausführbare Datei (z. B. app.exe auf Windows-Plattformen für eine Anwendung mit dem Namen app), die eine umbenannte Version des plattformspezifischen .NET Core Host ist, und eine DLL-Datei (z. B. app.dll) die eigentliche Anwendung.

17
ciriarte

*.deps.json kommt von preserveCompilationContext.

Das Beibehalten des Kompilierungskontexts ist nützlich für die Laufzeitkompilierung (d. H. Just-in-Time-Kompilierung) und insbesondere für das Kompilieren von Ansichten. Für Bibliotheken ist es normalerweise nicht nützlich. So beheben Sie Ihr Problem:

  1. Entferne preserveCompilationContext von jedem Company.* Bibliothek, auf die Ihre App verweist.
  2. Wenn dies nicht funktioniert, entfernen Sie auch preserveCompilationContext aus Ihrer Haupt-App.

Hier gibt es ein anstrengendes Gespräch: https://github.com/aspnet/Mvc/issues/5141

9
Shaun Luttin

Wenn Sie das neuere .csproj-Format verwenden

Das Hinzufügen von <PreserveCompilationContext>false</PreserveCompilationContext> Unter dem Tag <TargetFramework> Hat das Problem für mich behoben.

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

Nachdem eine vollständige Suche endlich meine Lösung gefunden hatte, war dies mein Fall: - passiert nur beim Ausführen

dotnet veröffentlichen

um dies zu lösen, bearbeiten Sie Ihren csproj und stellen Sie sicher, dass Sie diese Konfiguration haben.

Dies gilt für webapi netcoreapp 2.0

<PropertyGroup>
    <MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
    <PreserveCompilationContext>false</PreserveCompilationContext>
</PropertyGroup>

dies wird auch Probleme im Zusammenhang mit lösen

"Fehler CS0246: Der Typ- oder Namespace-Name" System "wurde nicht gefunden"

ref .: https://github.com/aspnet/MvcPrecompilation/issues/162https://github.com/dotnet/dotnet-docker/issues/279

2
german1311