Створюйте пакет NuGet автоматично, включаючи посилання на залежності


83

Я хочу запустити локальне / внутрішнє сховище NuGet . Думаю, я зрозумів, як «використовувати повторно» існуючі пакети NuGet, включаючи їх у фіктивний проект за допомогою NuGet та скануючи файл пакету, щоб захопити мої локально кешовані .nupkgфайли , але ...

Як створити nuget-пакет ( .nupkg) з проекту, автоматично включаючи всі dll залежності, а не лише ті, що були захоплені через NuGet?

Зокрема:

  1. Створіть рішення
  2. Додайте новий проект
  3. Додайте посилання на різні .dllфайли / інші проекти <- це відсутня частина
  4. Додавайте пакети NuGet через менеджер пакунків / cmdline / будь-що інше
  5. щось автоматично створює файл.nupkg

З того, що я знайшов, ви повинні робити такі речі

  • вручну відредагуйте .csprojфайл, щоб додати, <BuildPackage>true</BuildPackage>щоб включити залежності
  • створити .nuspecфайл вручну та перелічити залежності вручну ( аналогічно? )
  • вручну запустити nuget packна вашому .nuspecфайлі

Але все ручне, що дурне. Навіть напівавтоматичні рішення все ще незручні або напівручні:

Я погоджуюсь на те, що автоматично створює .nuspecманіфест із посилань на проекти. Тоді теоретично те, що + nuget-подія збірки може бути зведене в пакет build-project / nuget, що я справді хочу побачити.


Я щойно натрапив на це розширення VS eyecatch.no/projects/nuget-package-template, яке мені потрібно буде розглянути ...
drzaus

3
П'ять років потому, а специфікація або пакет nuget 4.x все ще не може визначити залежності.
StingyJack

Чи є оновлення для цього випуску? Або у вас все ще є ці проблеми?
Домінік Йонас

Я відмовився від цього деякий час тому, але перевірте NuProj, як повідомляє ця відповідь
drzaus

Ця проблема все ще існує. :(
BrainSlugs83

Відповіді:


75

Ваш пункт № 3 ( Додайте посилання на різні .dll-файли / інші проекти <- це відсутня частина ) насправді містить дві різні проблеми: (1) додайте посилання на різні DLL-файли та (2) додайте посилання на інші проекти в те саме рішення.

Номер (2) тут отримав деяку додаткову підтримку, починаючи з NuGet 2.5 . Ви можете додати опцію включення посилань на інші проекти в тому ж рішенні під час створення пакета NuGet для проекту:

nuget pack projectfile.csproj -IncludeReferencedProjects

Якщо projectfile.csprojпосилання на будь-які інші проекти у вашому рішенні, які також виставляються як пакети NuGet, ці пакети NuGet будуть додані як залежності. Якщо він посилається на проекти у вашому рішенні, які не представляють себе пакетами NuGet, їх dll буде включено в цей пакет NuGet.

Що стосується (1), якщо ви часто додаєте DLL до своїх проектів, які недоступні як пакети NuGet, ви можете просто створити власні (внутрішні) пакети NuGet з цими файлами. Якщо ви потім додасте ці dll як пакет NuGet замість файлів безпосередньо, цей пакет NuGet буде залежністю в пакеті NuGet вашого проекту.


3
зітхання # 1 все ще занадто ручне на мій смак. Насправді я намагаюся зробити "створити власний (внутрішній) пакет NuGet з цими файлами" - вся суть цього питання полягає в тому, що я хочу автоматично згортати не-NuGet .dll у пакет NuGet. Не переглядати і перераховувати кожну dll вручну в a .nuspec, що, на мою думку, ви пропонуєте?
drzaus

Вам не потрібно вказувати кожну DLL окремо. Це справді було б багато роботи, якщо їх у вас багато . Перераховуючи файли для включення, ви можете використовувати (рекурсивні) узагальнюючі символи ( docs.nuget.org/docs/reference/… ), тому, якщо ви, наприклад, помістите всі ці бібліотеки DLL в окрему папку, це буде однолінійний вкладиш, щоб включити їх усіх.
Джуліан

Ах, тепер я потрапляю туди, куди ви прямуєте - тому, якщо я роблю проект обгортки, включаю посилання через звичайний "проект правою кнопкою миші> Додати посилання", то я можу зробити такий, nuspecщо включає все в binкаталог (припускаючи мої посилання всі "копіюють локально"), він автоматично підбере все, що я додав. Здається, трохи замучений, але, мабуть, спрацює.
drzaus

6
Він не буде автоматично забирати те, що є у вашому каталозі bin, вам потрібно було б вказати це явно, приблизно так:<file src="bin\release\*.dll" target="lib" />
Джуліан

2
Зауважте, що якщо у проектів, на які посилаються, є файл nuspec, тоді nuget буде розглядати його як пакет і НЕ включати в папку lib, але додаватиме його до залежностей пакета
workabyte

5

Для інших працівників Google ви можете використовувати це, якщо для запуску NuGet Pack використовуєте файл NuGet.targets:

<Target Name="PrePackage" BeforeTargets="BuildPackage">
  <PropertyGroup>
    <BuildCommand>$(BuildCommand) -IncludeReferencedProjects</BuildCommand>
  </PropertyGroup>
</Target>

7
Звучить багатообіцяюче, але недостатньо інформації для реального впровадження. Що це за файл NuGet.targets, про який ви говорите? Я загалом знайомий з цільовими файлами збірки, але не з цим конкретним випадком використання
bikeman868

2

Заціни!

Рішення, яке я знайшов, є розширенням для Visual Studio: https://visualstudiogallery.msdn.microsoft.com/fbe9b9b8-34ae-47b5-a751-cb71a16f7e96/view/Reviews

Ви просто додаєте новий проект під назвою Nuget Package NuGet Package

Тоді ви додаєте цікаві ваші проекти до посилань та BOOOM !! Усі залежності та каталоги файлів додаються автоматично. Якщо ви хочете змінити дані NuSpec, клацніть правою кнопкою миші в проекті та перейдіть до Властивості, а потім змініть те, що ви хочете. Створені NuSpec та nupkg будуть у папці obj вашого нового проекту. Сподіваюся, це допоможе;).


1
Чи є також рішення для VS2017?
Домінік Йонас

Це не працює у випадку генерації пакетів на сервері збірки.
Michi-2142

Шкода, що це застаріло. Було б корисно.
joelc

2

Я знайшов добре написану статтю на цю тему. У мене така ж проблема з певними пакетами, які мають ієрархію залежностей, і до цих пір я завантажував кожен як окремий пакет NuGet (що. Втрата часу

Я щойно перевірив рішення, знайдене тут: https://dev.to/wabbbit/include-both-nuget-package-references-and-project-reference-dll-using-dotnet-pack-2d8p

І після вивчення пакета NuGet за допомогою NuGet Package Explorer, бібліотеки DLL, створені за допомогою посилань на проекти, справді є. Я збираюся протестувати, фактично надіславши цей пакет NuGet і протестувавши його.

Ось моє джерело на випадок, якщо це вам буде корисно: https://github.com/jchristn/NuGetPackTest

І тестовий пакет NuGet: https://www.nuget.org/packages/NuGetPackTest/1.0.0

Здається, рішення працює добре. Я не знаю, як це буде виглядати, коли є шари посилань, я впевнений, що це може стати по-справжньому волохатим і дуже швидким.

введіть тут опис зображення

.csproj з бібліотеки NuGetPackTest, яка посилається на проект TestLibrary (частини видалено для стислості)

<Project Sdk="Microsoft.NET.Sdk">
 
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;netcoreapp3.0;netcoreapp3.1;net461</TargetFrameworks>
    ...
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>

    <!-- added this line -->
    <TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);CopyProjectReferencesToPackage</TargetsForTfmSpecificBuildOutput>
  </PropertyGroup>

  <ItemGroup>

    <!-- modified this ProjectReference to include the children ReferenceOutputAssembly and IncludeAssets -->
    <ProjectReference Include="..\TestLibrary\TestLibrary.csproj">
      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
      <IncludeAssets>TestLibrary.dll</IncludeAssets>
    </ProjectReference>
  </ItemGroup>

  <!-- added this section -->
  <Target DependsOnTargets="ResolveReferences" Name="CopyProjectReferencesToPackage">
    <ItemGroup>
      <BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))"/>
    </ItemGroup>
  </Target>
  
</Project>

1
це негайно вирішило мою проблему. Я слідував інструкціям, згаданим у посиланні, і це спрацювало. Приємно, якщо у вашій відповіді також додано суть.
Jabez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.