Веб-работа: библиотека не найдена
У нас есть непрерывный WebJob, написанный на.NET Core 2.x и работающий в течение последних нескольких недель. Недавно кто-то внес некоторые изменения в этот WebJob и принес сторонний пакет NuGet. Теперь я не могу запустить WebJob, потому что он не может найти одну из зависимостей сторонних библиотек.
Это сообщение об ошибке:
D: \ local \ Temp \ jobs \ непрерывный \Temp1\oitdncff.sfg>dotnet Temp1.dll
Ошибка:
Сборка, указанная в манифесте зависимостей приложения (Temp1.deps.json), не найдена:
пакет: 'System.Drawing.Common', версия: '4.5.0-preview1-25914-04'
путь: "время выполнения /win/lib/netcoreapp2.0/System.Drawing.Common.dll"
Я попробовал несколько вещей, которые нашел во время поиска этой проблемы. Вот PropertyGroup и ItemGroup (пакеты NuGet) из файла csproj:
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.0</TargetFramework>
<ApplicationIcon />
<StartupObject>Temp1.Program</StartupObject>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<LangVersion>latest</LangVersion>
<Version>1.0.0.0</Version>
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
<PackageReference Include="AsyncEnumerator" Version="2.1.0" />
<PackageReference Include="EPPlus.Core" Version="1.5.4" />
<PackageReference Include="Microsoft.ApplicationInsights" Version="2.5.1" />
<PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="2.0.0" />
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.0-beta4" />
<PackageReference Include="Microsoft.Azure.WebJobs.Logging.ApplicationInsights" Version="3.0.0-beta4" />
<PackageReference Include="Microsoft.Azure.WebJobs.ServiceBus" Version="3.0.0-beta4" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
</ItemGroup>
Согласно предложениям онлайн, я добавил строку <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
а также <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
Рассматриваемый пакет с зависимостью - EPPlus.Core
Я подтвердил, что библиотека System.Drawing.Common
существует в папке приложения в нашем веб-приложении Azure, но когда запускается WebJob, он игнорирует наличие файла и просматривает его во время выполнения (GAC) и не работает.
ОБНОВЛЕНИЕ: Я понял, что пакет EPPlus.core не был официальным, поэтому переключился на официальный пакет, надеясь, что это устранит ошибку. Та же ошибка, но новая версия System.Drawing.Common version: 4.5.0-preview1-26216-02
Я вручную добавил пакет NuGet для System.Drawing.Common version: 4.5.0-preview2-26406-04
в проекте, это удалило исходную ошибку, но затем я начал получать ошибку, которая Microsoft.Win32.SystemEvents version: 4.5.0-preview2-26406-04
невозможно найти. Эта библиотека зависит от System.Drawing.Common
,
Я попытался сделать то же самое, что и выше, и добавил пакет NuGet для Microsoft.Win32.SystemEvents version: 4.5.0-preview2-26406-04
непосредственно к проекту, но на этот раз ошибка не исчезнет.
ДАЛЬНЕЙШЕЕ ОБНОВЛЕНИЕ: После поиска больше я наткнулся на сообщение, в котором говорилось о публикации, а затем заархивировал опубликованный каталог и загрузил zip. Это действительно сработало, ошибка, о которой идет речь, исчезла, но это не совсем решение. Мы используем VSTS в качестве нашей системы репо и нашего CI/CD. У меня есть настройка сборки, чтобы сделать публикацию, а затем скопировать файлы. WebJob выдает ошибку при развертывании через этот процесс.
1 ответ
Во-первых, я хотел бы заявить, что на сегодняшний день, насколько мне известно, .NET Core не поддерживается на 100% с помощью веб-заданий Azure (не стесняйтесь исправлять меня, если я ошибаюсь), но есть много статей и сообщений о том, как сделать они работают.
Ниже приведено решение, которое я принял, чтобы обойти вышеупомянутую проблему, с которой столкнулся, и хотя я не чувствую, что это элегантно, я чувствую, что Microsoft сделала нечто странное, что большинство разработчиков не считают правильным путем.
Причина, по которой у меня возникли проблемы, заключалась в том, что при сборке (в отладке или выпуске) файл манифеста всегда указывал на среды выполнения (GAC). Локальный запуск на моем компьютере никогда не был проблемой, потому что файлы можно было найти. Странность заключается в том, что при сборке в режиме выпуска все файлы были скопированы в папку bin, но манифест все же велел программе смотреть во время выполнения и не использовать локальные копии. Когда это было передано самой WebJob, эти файлы не существовали во время выполнения, поэтому WebJob будет генерировать исключения.
Обходной путь, который я должен был сделать, заключается в следующем:
- сборка dotnet (решение - конфигурация выпуска)
- Dotnet Publish (только для WebJobs - не архивировать)
- Dotnet Publish (только веб-проект - не архивировать)
- Скопируйте данные WebJob из публикации в каталог веб-проекта \App_Data\jobs\ непрерывный \ каталог
- Zip Up Web Project Опубликованный каталог (это то, что развертывается)
Мое честное мнение: когда я создаю проект webjob в режиме релиза, процесс должен преобразовать манифест для поиска любых библиотек, на которые есть ссылки, локально, прежде чем пытаться искать их во время выполнения.