Próbuję napisać system wtyczek z .NET Core, a jednym z moich wymagań jest możliwość dystrybucji biblioteki DLL wtyczki wraz z jej zależnościami do użytkownika w celu zainstalowania.
Nie mogę jednak dowiedzieć się, jak uwzględnić moje zależności NuGet jako artefakt kompilacji i umieścić je w folderze kompilacji bez konieczności użycia ich dotnet publish
jako hackowania. Czy istnieje sposób, w jaki mogę to określić w pliku .csproj (pliku projektu)?
dotnet publish
być włamaniem? Dołącz polecenie do pliku csproj jako skrypt po kompilacji.dotnet publish
wrzuca cały framework do folderu publikowania, ponieważ piszę wtyczkę, większość plików nie jest potrzebna, ponieważ framework byłby już załadowany przez program ładujący. Szukam czegoś podobnego do tego, jak działają kompilacje na .NET Framework.<CopyToOutputDirectory>Always</CopyToOutputDirectory>
w csproj każdej z bibliotek dll, które chcesz przenieść, nie załatwia sprawy? Może w połączeniu z<link>
węzłem?<PackageReference/>
nie obsługuje<CopyToOutputDirectory>
.Odpowiedzi:
Możesz dodać to do pliku
<PropertyGroup>
wewnątrz pliku csproj, aby wymusić kopiowanie zestawów NuGet do danych wyjściowych kompilacji:Należy jednak pamiętać, że wynik kompilacji (
bin/Release/netcoreapp*/*
) nie powinien być przenośny i dystrybuowalny, wynikdotnet publish
jest. Ale w twoim przypadku kopiowanie zestawów do danych wyjściowych kompilacji jest prawdopodobnie bardzo przydatne do celów testowych. Należy jednak pamiętać, że można również użyćDependencyContext
interfejsu API do rozwiązywania bibliotek DLL i ich lokalizacji, które są częścią wykresu zależności aplikacji, zamiast wyliczać katalog lokalny.źródło
DependencyContext
? Jak mogę go użyć, aby znaleźć bibliotekę DLL, której nie ma w katalogu aplikacji? Gdzie to w ogóle jest?Możesz użyć PostBuildEvent, aby zautomatyzować wdrażanie modułów podczas kompilacji.
Aby uzyskać zestawy NuGet w folderze kompilacji, dodaj csproj modułu
Zdefiniuj, które pliki modułów chcesz, gdzie przy użyciu Uwzględnij / Wyklucz (zmodyfikuj ścieżkę w razie potrzeby)
Zresetuj folder kompilacji do domyślnego i dodaj PostbuildEvent
Dołączam app_offline do recyklingu aplikacji, jeśli jest już uruchomiona, aby uniknąć błędów w użyciu plików.
źródło
Dodawanie
nie zadziałało, ale dodanie tego do pliku .csproj Framework:
zrobił.
źródło
„Rozwiązałem” to (stworzyłem obejście) w prostszy sposób.
W budowaniu postu
pub
jest folderem, w którym chcesz umieścić swoje opublikowane rzeczy na postojuUWAGA: w zależności od używanej wersji
dotnet.exe
, polecenie--no-build
może nie być dostępne.Na przykład niedostępne w wersji 2.0.3; i dostępny w wersji 2.1.402. Wiem, że VS2017 Update4 miał v2.0.3. A Update8 ma 2.1.x
Aktualizacja:
Powyższa konfiguracja będzie działać w podstawowym środowisku debugowania, ale aby umieścić ją w środowisku serwera kompilacji / środowisku produkcyjnym, potrzeba więcej. W tym konkretnym przykładzie, który musiałem rozwiązać, budujemy
Release|x64
iRelease|x86
osobno. Więc rozliczyłem się z obu. Aby jednak obsługiwać polecenie po kompilacjidotnet publish
, najpierw dodałemRuntimeIdentifier
do pliku projektu.Dlaczego tego potrzebowałem i dlaczego możesz się bez niego obejść? Potrzebowałem tego, ponieważ mój program kompilacji jest ustawiony na przechwytywanie ostrzeżenia MSB3270 i niepowodzenie kompilacji, jeśli się pojawi. To ostrzeżenie mówi: „Hej, niektóre pliki w Twoich zależnościach mają niewłaściwy format”. Ale czy pamiętasz cel tego ćwiczenia? Musimy pobrać biblioteki DLL zależności pakietów. W wielu przypadkach nie ma znaczenia, czy jest to ostrzeżenie, ponieważ po kompilacji nie obchodzi. Ponownie, to jest mój program do kompilacji, który dba. Więc dodałem tylko
RuntimeIdentifier
2 konfiguracje, których używam podczas kompilacji produkcyjnej.Pełna kompilacja postu
Objaśnienie: dotnet Publishing wyszukuje
obj\Debug
lubobj\Release
. Nie mamy tego podczas kompilacji, ponieważ build tworzyobj\x64\Release
lubobj\x86\Release
. Wiersze 1 i 2 łagodzą ten problem. W linii 3 mówię,dotnet.exe
aby użyć określonej konfiguracji i docelowego środowiska wykonawczego. W przeciwnym razie, gdy jest to tryb debugowania, nie obchodzą mnie rzeczy i ostrzeżenia w czasie wykonywania. W ostatniej linii po prostu pobieram moje biblioteki dll i kopiuję je do folderu wyjściowego. Zadanie wykonane.źródło
dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub
xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
W połączeniu z powyższą odpowiedzią: Mam to doskonale działające w wierszu poleceń zdarzenia po kompilacji: w Visual Studio. Pętla obejmuje wybrane biblioteki DLL (System * .dll i Microsoft .dll) *, a następnie pomija usuwanie określonych bibliotek DLL. System.Data.SqlClient.dll i System.Runtime.Loader.dll
źródło