Подтвердить что ты не робот

Что такое deps.json, и как я могу использовать относительные пути?

Я создаю проект ASP.NET Core для TeamCity. В двоичных файлах он запускает сбой при запуске на других машинах. Сообщение об ошибке показывает, что он ищет DLL в путях, которые существуют только на сервере сборки. DotPeek показывает, что встроенный файл ресурсов в .exe называется myproject.deps.json. В разделе целей есть ссылки на dll с использованием абсолютных путей. Это означает, что бинарные файлы ASP.NET Core будут запускаться только на машине, на которой они были построены.

Как исправить эту проблему? Что это за файл, и как я могу использовать относительные пути? После некоторого копания, похоже, что пути идут от 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%" ]
  }
}
4b9b3361

Ответ 1

Ответ на ваш первый вопрос, за Документация по настройке времени выполнения:

И ответ на второй вопрос заключается в том, чтобы удалить файл preserveCompilationContext в файле project.json(и перестроить).

MyApp.deps.json - это список зависимостей, а также данные контекста компиляции и зависимости от компиляции. Технически не требуется, но требуется использовать функции обслуживания или кеширования пакетов/совместного использования пакетов.

За ваш комментарий к Dimitry я не мог сказать, установлено ли на вашем целевом компьютере сетевое ядро ​​.net, и поэтому выведите тип развертывания, которое вы пытаетесь сделать. Но при условии, что он установлен, вы сможете настроить myproject.runtime.json, чтобы исправить свои проблемы. Если вы этого не сделаете, я настоятельно рекомендую прочитать два разных типа . Развертывание NET Core Application:

Вы можете создать два типа развертываний для приложений .NET Core:

Рациональное развертывание. Как следует из названия, зависящее от платформы развертывание (FDD) опирается на общую общесистемную версию .NET Core, которая будет присутствовать в целевой системе. Потому что .NET Core уже присутствует, ваше приложение также переносится между установки .NET Core. Ваше приложение содержит только собственный код и любые зависимости сторонних производителей, которые находятся за пределами .NET Core библиотеки. FDD содержат файлы .dll, которые можно запускать с помощью dotnet из командной строки. Например, dotnet app.dll работает приложение с именем app.

Самостоятельное развертывание. В отличие от FDD, автономное развертывание (SCD) не зависит от каких-либо общих компонентов, присутствующих на целевой системы. Все компоненты, включая библиотеки .NET Core и среда выполнения .NET Core, включены в приложение и являются изолированных от других приложений .NET Core. SCD включают исполняемый файл (например, app.exe на платформах Windows для приложения с именем app), которая является переименованной версией хоста .NET Core на платформе, и DLL файл (например, app.dll), который является фактическим приложением.

Ответ 2

*.deps.json происходит от preserveCompilationContext.

Сохранение контекста компиляции полезно для компиляции во время выполнения (т.е. компиляции точно в момент времени) и особенно для компиляции представлений. Обычно это не полезно для библиотек. Чтобы устранить проблему:

  • Удалите preserveCompilationContext из каждой библиотеки Company.*, на которую ссылается ваше приложение.
  • Если это не сработает, удалите preserveCompilationContext из основного приложения.

Здесь присутствует разговор: https://github.com/aspnet/Mvc/issues/5141

Ответ 3

Если вы используете новый формат .csproj

Добавление <PreserveCompilationContext>false</PreserveCompilationContext> под тегом <TargetFramework> исправило проблему для меня.

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

Ответ 4

Я создал TeamCity для создания двух моих проектов, и нет проблем с их последующим использованием на разных машинах. Я использовал это руководство для создания конфигурации сборки: Сборка, тестирование и развертывание проектов .NET Core с TeamCity.

Плагин TeamCity можно загрузить здесь: . Поддержка NET Core

Вот исходный код GitHub, если вы посмотрите wana: TeamCity.NET Core Plugin

И вот некоторые сведения об установке плагинов TeamCity: Установка дополнительных плагинов