NuGet başvurularını derleme çıktısına kopyalamak için .NET Core projelerini nasıl edinebilirim?


115

.NET Core ile bir eklenti sistemi yazmaya çalışıyorum ve gereksinimlerimden biri eklenti DLL'sini bağımlılıkları ile birlikte yüklemek için kullanıcıya dağıtabilmektir.

Ancak, NuGet bağımlılıklarımı bir yapı yapısı olarak nasıl dahil edeceğimi ve bunları dotnet publishbir hack olarak kullanmak zorunda kalmadan derleme klasörüne nasıl çıktılayacağımı anlayamıyorum . Bunu .csproj dosyasında (proje dosyası) belirtebilmemin bir yolu var mı?


2
Kullanmak neden dotnet publishbir hack olsun? Komutu, derleme sonrası komut dosyası olarak csproj dosyanıza ekleyin.
Austin Drenski

3
dotnet publishtüm çerçeveyi yayınlama klasörüne atıyor, çünkü ben bir eklenti yazıyorum, çerçeve zaten önyükleyici programı tarafından yükleneceği için dosyaların çoğu gerekli değil. Derlemelerin .NET Framework üzerinde nasıl çalıştığına benzer bir şey arıyorum.
chyyran

Ve <CopyToOutputDirectory>Always</CopyToOutputDirectory>taşımak istediğiniz dll'lerin her birine csproj'unuzu eklemek hile yapmıyor mu? Belki bir <link>düğüm ile birleştirilir ?
Austin Drenski

7
<PackageReference/>desteklemiyor <CopyToOutputDirectory>.
chyyran

1
Yine de "tüm çerçeve" NuGet'ten gelir .. ve tüm NuGet derlemelerini derleme çıktısına kopyalamaya karar verirseniz, hepsini alırsınız ..
Martin Ullrich

Yanıtlar:


185

<PropertyGroup>NuGet derlemelerini derleme çıktısına kopyalamaya zorlamak için bunu csproj dosyanızın içine ekleyebilirsiniz :

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

Bununla birlikte, build çıktısının ( bin/Release/netcoreapp*/*) taşınabilir ve dağıtılabilir olmaması gerektiğini unutmayın , dotnet publishis. Ancak sizin durumunuzda, derlemeleri derleme çıktısına kopyalamak muhtemelen test amaçları için çok yararlıdır. Ancak DependencyContext, bir yerel dizini numaralandırmak yerine uygulamanın bağımlılık grafiğinin parçası olan DLL'leri ve konumlarını çözmek için de api'yi kullanabileceğinizi unutmayın .


7
Sadece Nuget dll'lerini değil, tüm dll'leri kopyalamaya neden oluyor
Mohammad Dayyan

2
Core 2 Ben de tüm Microsoft DLL'leri alıyorum. Neden emin değilim ama önce NuGet'i alıyordum ama sonra yapmayı bıraktı mı? can sıkıcı
Piotr Kula

4
@MartinUllrich Biraz daha detaylandırır DependencyContextmısınız? Uygulama dizininde olmayan bir DLL bulmak için nasıl kullanabilirim? Her neyse nerede?
ygoe

2
benim için çalışmıyor asp.net çekirdeği System.ValueTuple.dll kopyalamıyor
Ali Yousefi

1
.Net çerçeve projeleri için @AliYousefie system.valuietuple artık en son .net çerçeve sürümlerinde NuGet'ten gelmemeli ve araç oluşturma
Martin Ullrich

10

Derlemede modül dağıtımını otomatikleştirmek için PostBuildEvent'i kullanabilirsiniz.

Yapı klasöründe NuGet derlemelerini almak için modülünüzün csproj'unu ekleyin

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

Dahil Et / Hariç Tut'u kullanarak nerede olmasını istediğiniz modül dosyalarını tanımlayın (yolu gerektiği gibi değiştirin)

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

Derleme klasörünüzü varsayılana sıfırlayın ve PostbuildEvent 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>

Dosya kullanımda hatalarını önlemek için zaten çalışıyorsa, uygulamayı geri dönüştürmek için app_offline'ı ekliyorum.


Projemde "Microsoft.Extensions.Logging.Log4Net.AspNetCore" Nuget kitaplığına bağımlılığım var ve bu NetCore'un bir parçası değil, bu nedenle bu yaklaşım işe yaramayacak
sad_robot

4

Ekleme

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

işe yaramadı, ancak bunu Framework .csproj dosyasına ekleyerek:

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>

yaptı.


Net Framework 4.7.2 projesinden .net Standard 2.0 kitaplıklarına başvururken bu benim için iyi çalıştı. Başka hiçbir şey düzeltmedi.
Grungondola

3

Bunu daha basit bir şekilde "çözdüm" (geçici bir çalışma yarattım).

Post yapıda

dotnet publish "$(ProjectFileName)" --no-build -o pub
xcopy "$(ProjectDir)pub\3rdPartyProvider.*.dll" "$(OutDir)"

pub yayınlanan içeriklerinizin hazırlanmasını istediğiniz klasördür

NOT: Kullandığınız versiyona bağlı olarak dotnet.exekomut --no-buildkullanılamayabilir.

Örneğin, v2.0.3'te mevcut değildir; ve v2.1.402'de mevcuttur. VS2017 Update4'ün v2.0.3'e sahip olduğunu biliyorum. Güncelleme8'de 2.1.x var

Güncelleme:

Yukarıdaki kurulum, temel hata ayıklama ortamında çalışacaktır, ancak bunu sunucu / üretim ortamına yerleştirmek için daha fazlasına ihtiyaç vardır. Ben çözmek zorunda olduğu bu özel örnekte, inşa Release|x64ve Release|x86ayrı ayrı. Bu yüzden ikisini de hesaba kattım. Ancak post build dotnet publishkomutunu desteklemek için önce RuntimeIdentifierproje dosyasına ekledim .

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
  <OutputPath>..\..\lib\</OutputPath>
  <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
  <OutputPath>..\..\lib\</OutputPath>
  <RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>

Neden buna ihtiyacım vardı ve neden onsuz kurtulabilirsin? Çünkü bu gerekli benim yapı programı yolunu kesmek uyarı olarak ayarlanır MSB3270 ve görünürse yapı başarısız. Bu uyarı, "bağımlılıklarınızdaki bazı dosyalar yanlış formatta" diyor. Ama bu egzersizin amacını hatırlıyor musunuz? Paket bağımlılık DLL'lerini çekmemiz gerekiyor. Ve çoğu durumda, bu uyarının orada olup olmadığı önemli değildir, çünkü sonraki derleme sonrası bunu önemsemez. Yine, bu benim derleme programım. Bu nedenle, yalnızca RuntimeIdentifierüretim derlemesi sırasında kullandığım 2 yapılandırmaya ekledim .

Tam Gönderi yapısı

if not exist "$(ProjectDir)obj\$(ConfigurationName)" mkdir "$(ProjectDir)obj\$(ConfigurationName)"
xcopy  "$(ProjectDir)obj\$(PlatformName)\$(ConfigurationName)" "$(ProjectDir)obj\$(ConfigurationName)" /E /R /Y

if $(ConfigurationName) == Release (
    dotnet publish "$(ProjectFileName)" --runtime win-$(PlatformName) --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
) else (
    dotnet publish "$(ProjectFileName)" --no-build -c $(ConfigurationName) -o pub --no-restore --no-dependencies
)

xcopy "$(ProjectDir)pub\my3rdPartyCompany.*.dll" "$(OutDir)" /Y /R

Açıklama: dotnet publish obj\Debugveya arıyor obj\Release. Oluşturma sırasında buna sahip değiliz çünkü build obj\x64\Releaseveya obj\x86\Release. Satır 1 ve 2 bu sorunu hafifletir. 3. satırda, dotnet.exebelirli bir yapılandırma ve hedef çalışma zamanı kullanmayı söylüyorum . Aksi takdirde, bu hata ayıklama modu olduğunda, çalışma zamanı işleri ve uyarıları umursamıyorum. Ve son satırda dll'lerimi alıp çıktı klasörüne kopyalıyorum. İş bitmiş.


Projede hata ayıklama yapılandırması yoksa (benim durumumdaki gibi) "dotnet publish" komutu için "-c Release" parametresi gereklidir. Bu yüzden bu partiyi derleme sonrası etkinlik olarak kullandım: dotnet publish "$(ProjectFileName)" -c Release --no-build -o bin\pub xcopy "$(ProjectDir)pub\PostSharp.dll" "$(OutDir)"
Xtro

0

Yukarıdaki yanıtla bağlantılı olarak: Bunu Post-build olay komut satırında harika bir şekilde çalıştırıyorum: Visual Studio'da. Bir dizi dll (Sistem * .dll ve Microsoft .dll) * üzerinde döngü oluşturur ve ardından belirli dll'lerin silinmesini atlar. System.Data.SqlClient.dll ve System.Runtime.Loader.dll

for %%f in ($(OutDir)System*.dll $(OutDir)Microsoft*.dll) do if not %%f == $(OutDir)System.Data.SqlClient.dll if not %%f == $(OutDir)System.Runtime.Loader.dll del %%f
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.