Soru .NET Core projeleri, çıktı oluşturmak için NuGet referanslarını kopyalamak için nasıl kullanılır?


.NET Core ile bir eklenti sistemi yazmaya çalışıyorum ve gereksinimlerimden biri eklenti DLL'lerini yüklemesi için kullanıcının bağımlılıkları ile birlikte dağıtabilmektir. Ancak, NuGet bağımlılıklarını bir yapı artefaktı olarak nasıl ekleyeceğimi ve bunları kullanmak zorunda kalmadan yapı klasörüne nasıl çıkaracağını anlayamıyorum. dotnet publish Bir hack olarak. Bunu csproj'da belirleyebileceğim bir yol var mı?


25
2018-05-07 23:05


Menşei


Neden kullanmalı dotnet publish hack ol Komut dosyasını csproj dosyanıza post inşa komut dosyası olarak ekleyin. - Austin Drenski
dotnet publish Bir eklenti yazdığımdan, tüm çerçeveyi yayınlama klasörüne atar, çünkü çerçeve zaten önyükleyici programı tarafından yükleneceğinden dosyaların çoğunluğu gerekli değildir. .NET Framework üzerinde nasıl çalışıldığına benzer bir şey arıyorum. - ron975
Ve dahil <CopyToOutputDirectory>Always</CopyToOutputDirectory> csproj'unda taşımak istediğin dlllerin her biri hile yapmaz mı? Belki de bir <link> Düğüm? - Austin Drenski
<PackageReference/> Desteklemiyor <CopyToOutputDirectory>. - ron975
"Tüm çerçeve" NuGet'ten geliyor. Ve tüm NuGet meclislerini yapı üretimine kopyalamayı tercih ederseniz, hepsini alacaksınız. - Martin Ullrich


Cevaplar:


Bunu bir <PropertyGroup> NuGet meclislerini dahili çıktıya kopyalamayı zorlamak için csproj dosyanızın içinde:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

Ancak, yapı çıktısı olduğunu unutmayın (bin/Release/netcoreapp*/*) taşınabilir ve dağıtılabilir olması gerekiyordu, çıktı dotnet publish olduğunu. Ancak sizin durumunuzda, derlemeleri yapı üretimine kopyalamak, test amacıyla büyük olasılıkla faydalıdır. Ama aynı zamanda DependencyContext Yerel dizini sıralamak yerine, uygulamanın bağımlılık grafiğinin bir parçası olan DLL'leri ve konumlarını çözümlemek için API.


47
2018-05-08 06:53



Sadece Nuget dlls değil, tüm dll'lerin kopyalanmasına neden oluyor - Mohammad Dayyan
Başvurulan projelerden dll'ler her zaman kopyalanır, nuget aracılığıyla gelen dll'ler bu mekanizma üzerinden sadece ek olanlar olmalıdır. @Mohammad Dayyan hangi ek dosyaları görüyorsunuz? (Hatta System. * dll'lerin bile nuget yoluyla geldiğine dikkat edin) - Martin Ullrich
Çekirdek 2 Ben de tüm Microsoft DLL dosyaları alıyorum. Emin değilim neden ama sadece NuGet almadan önce ama sonra bunu yapmayı bıraktı? Can sıkıcı - ppumkin
@MartinUllrich hakkında ayrıntılı bilgi verebilir misiniz? DependencyContext? Uygulama dizininde olmayan bir DLL dosyasını bulmak için nasıl kullanabilirim? Her neyse nerede? - ygoe


Oluşturma sırasında modül dağıtımını otomatikleştirmek için PostBuildEvent öğesini kullanabilirsiniz.

Oluşturma klasöründe NuGet derlemeleri almak için csproj senin modülünün

<PropertyGroup>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

Kullanarak / İçerde Et (kullanacağınız yolu değiştirin) kullanarak istediğiniz modül dosyalarını tanımlayın.

<ItemGroup>
    <ModuleFiles
      Include="$(TargetDir)*.dll"
      Exclude="$(TargetDir)System*.dll;$(TargetDir)Microsoft*.dll"
      DestinationPath="$(SolutionDir)src\MyProject\Modules\MyModule\%(Filename)%(Extension)">
    </ModuleFiles>
</ItemGroup>

Oluşturma klasörünüzü varsayılana sıfırlayın ve PostbuildEvent'i ekleyin.

<Target Name="PublishModule" AfterTargets="PostBuildEvent" Inputs="@(ModuleFiles)" Outputs="@(ModuleFiles->'%(DestinationPath)')">
    <WriteLinesToFile File="$(SolutionDir)src\[YOURAPP]\app_offline.htm" />
    <Copy SourceFiles="@(ModuleFiles)" DestinationFiles="@(ModuleFiles->'%(DestinationPath)')" />
    <Delete Files="$(SolutionDir)src\[YOURAPP]\app_offline.htm" />
</Target>

Kullanım hatalarını önlemek için zaten çalışıyorsa uygulamayı geri dönüştürmek için app_offline'ı ekliyorum.


5
2017-09-05 12:08



Benim projemde "Microsoft.Extensions.Logging.Log4Net.AspNetCore" Nuget kitaplığına bağımlılık var ve NetCore'un bir parçası değil, bu yüzden bu yaklaşım işe yaramayacak - sad_robot