Что такое 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%" ]
}
}
Ответы
Ответ 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: Установка дополнительных плагинов