IT이야기

NuGet 패키지를 만들 때 packages.config 파일의 종속성을 포함하지 마세요.

cyworld 2021. 4. 20. 21:41
반응형

NuGet 패키지를 만들 때 packages.config 파일의 종속성을 포함하지 마세요.


Nuget을 사용하여 패키지를 만들고 있습니다. .nuspec다른 NuGet 패키지에 대한 종속성 ( ) 파일을 포함하지 않는 패키지를 만들고 싶습니다 . 내 프로젝트에는 packages.config파일 에 NuGet 패키지 종속성이 정의되어 있습니다.

먼저 .nuspec파일을 만듭니다 ...

C:\code\MySolution>.nuget\nuget.exe spec MyProject\MyProject.csproj

생성 된 .nuspec파일을 종속성없이 최소한으로 편집합니다 .

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>
</package>

그런 다음 솔루션을 빌드하고 NuGet 패키지를 만듭니다.

C:\code\MySolution>.nuget\nuget.exe pack MyProject\MyProject.csproj -Verbosity detailed

다음은 해당 명령의 출력입니다 ...

Attempting to build package from 'MyProject.csproj'.
Packing files from 'C:\code\MySolution\MyProject\bin\Debug'.
Using 'MyProject.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies

Id: MyProject
Version: 1.2.3
Authors: Example
Description: Example
Tags: example
Dependencies: Google.ProtocolBuffers (= 2.4.1.473)

Added file 'lib\net40\MyProject.dll'.

Successfully created package 'C:\code\MySolution\MyProject.1.2.3.nupkg'.

.nupkg생성 패키지에는 .nuspec파일이 포함되어 있지만 원본 .nuspec파일 에는없는 종속성 섹션이 포함되어 있습니다.

<dependencies>
  <dependency id="Google.ProtocolBuffers" version="2.4.1.473" />
</dependencies>

나는 이것이 이런 일이 일어나고 있다고 믿습니다 ... (위의 출력에서)

Found packages.config. Using packages listed as dependencies

NuGet이 종속성을 자동으로 해결 하지 않고 명령 .nuspec에서 생성 된 파일에 삽입하도록 하려면 pack어떻게해야합니까?

현재 NuGet 2.2를 사용하고 있습니다. 또한이 동작이 이전 버전의 NuGet에서 발생했다고 생각하지 않습니다. 이것이 새로운 "기능"입니까? 이 "기능"이나 구현시기를 설명하는 문서를 찾을 수 없습니다.


버전 2.7에는 종속성을 포함하지 않도록 package.config에 설정할 수있는 developmentDependency라는 옵션이 있습니다.

패키지 생성시 개발 종속성 제외

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="jQuery" version="1.5.2" />
    <package id="netfx-Guard" version="1.3.3.2" developmentDependency="true" />
    <package id="microsoft-web-helpers" version="1.15" />
</packages>

패키지가 다른 패키지에 종속되지 않도록 방지

현재 NuGet 2.7 새로운 developmentDependency 속성이 될 수 에 추가 package프로젝트의에 노드 packages.config파일 . 따라서 프로젝트에 NuGet 패키지에 종속성으로 포함하지 않으려는 NuGet 패키지가 포함 된 경우 다음과 같이이 특성을 사용할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CreateNewNuGetPackageFromProjectAfterEachBuild" version="1.8.1-Prerelease1" targetFramework="net45" developmentDependency="true" />
</packages>

여기에 추가해야하는 중요한 부분은 developmentDependency="true".

개발 패키지가 다른 패키지에 의존하지 않도록 방지

다른 사용자가 사용할 수 있도록 개발 NuGet 패키지를 만드는 경우 패키지에 종속성으로 포함하고 싶지 않다는 것을 알고있는 경우 사용자가 NuGetdevelopmentDependency 을 사용하여 해당 특성을 packages.config 파일에 수동으로 추가하지 않아도됩니다. .nuspec 파일의 메타 데이터 섹션에있는 2.8 속성 . 이렇게하면 다른 사용자가 패키지를 설치할 때 developmentDependency 속성이 packages.config 파일에 자동으로 추가됩니다. 여기서 문제는 사용자가 최소한 NuGet 2.8을 설치해야한다는 것입니다. 운 좋게도 NuGet 2.5 minClientVersion 특성 을 사용하여 사용자가 v2.8 이상을 설치했는지 확인할 수 있습니다. 그렇지 않으면 패키지를 설치하기 전에 NuGet 클라이언트를 업데이트해야한다는 알림이 표시됩니다.

이것이 완벽한 개발 NuGet 패키지가 있습니다. 다음은 minClientVersion 및 developmentDependency 속성을 사용하는 방법을 보여주는 .nuspec 파일의 모양입니다 (각각 3 행과 20 행).

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata minClientVersion="2.8">
    <id>CreateNewNuGetPackageFromProjectAfterEachBuild</id>
    <version>1.8.1-Prerelease1</version>
    <title>Create New NuGet Package From Project After Each Build</title>
    <authors>Daniel Schroeder,iQmetrix</authors>
    <owners>Daniel Schroeder,iQmetrix</owners>
    <licenseUrl>https://newnugetpackage.codeplex.com/license</licenseUrl>
    <projectUrl>https://newnugetpackage.codeplex.com/wikipage?title=NuGet%20Package%20To%20Create%20A%20NuGet%20Package%20From%20Your%20Project%20After%20Every%20Build</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Automatically creates a NuGet package from your project each time it builds. The NuGet package is placed in the project's output directory.
    If you want to use a .nuspec file, place it in the same directory as the project's project file (e.g. .csproj, .vbproj, .fsproj).
    This adds a PostBuildScripts folder to your project to house the PowerShell script that is called from the project's Post-Build event to create the NuGet package.
    If it does not seem to be working, check the Output window for any errors that may have occurred.</description>
    <summary>Automatically creates a NuGet package from your project each time it builds.</summary>
    <releaseNotes>- Changed to use new NuGet built-in method of marking this package as a developmentDependency (now requires NuGet client 2.8 or higher to download this package).</releaseNotes>
    <copyright>Daniel Schroeder 2013</copyright>
    <tags>Auto Automatic Automatically Build Pack Create New NuGet Package From Project After Each Build On PowerShell Power Shell .nupkg new nuget package NewNuGetPackage New-NuGetPackage</tags>
    <developmentDependency>true</developmentDependency>
  </metadata>
  <files>
    <file src="..\New-NuGetPackage.ps1" target="content\PostBuildScripts\New-NuGetPackage.ps1" />
    <file src="Content\NuGet.exe" target="content\PostBuildScripts\NuGet.exe" />
    <file src="Content\BuildNewPackage-RanAutomatically.ps1" target="content\PostBuildScripts\BuildNewPackage-RanAutomatically.ps1" />
    <file src="Content\UploadPackage-RunManually.ps1" target="content\PostBuildScripts\UploadPackage-RunManually.ps1" />
    <file src="Content\UploadPackage-RunManually.bat" target="content\PostBuildScripts\UploadPackage-RunManually.bat" />
    <file src="tools\Install.ps1" target="tools\Install.ps1" />
    <file src="tools\Uninstall.ps1" target="tools\Uninstall.ps1" />
  </files>
</package>

사용자가 패키지를 사용하기 전에 NuGet v2.8 이상을 설치하도록 강요하지 않으려면 NuGet 2.8 developmentDependency 특성이 존재하기 전에 제가 생각해 낸 블로그에 게시 한 솔루션을 사용할있습니다 .


파일 PackageReference대신 요소를 사용하는 package.config경우 솔루션은 다음과 같습니다.

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc" PrivateAssets="All" />

또는

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc">
   <PrivateAssets>all</PrivateAssets>
</PackageReference>

관련 GitHub 토론


포함 할 파일을 명시 적으로 지정한 다음 nuspec 파일 자체에서 pack 명령을 실행할 수 있습니다.

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>

  <files>
    <file src="bin\Release\MyProject.dll" target="lib" />
  </files>

</package>

여기에서 nuspec 파일에 상대적인 경로로 src 속성을 설정해야합니다. 그런 다음 pack 명령을 실행할 수 있습니다.

nuget.exe pack MyProject\MyProject.nuspec

문제 # 1956 ( https://nuget.codeplex.com/workitem/1956 ) 및 pull request 3998 ( https://nuget.codeplex.com/SourceControl/network/forks/adamralph/nuget/contribution/3998 )에 따르면 기능은 2.4 릴리스 2.7 릴리스 에 포함 되었습니다.

그러나 기능에 대한 문서를 찾을 수 없으며 여전히 사용 방법을 찾지 못했습니다. 아는 사람이 있으면이 답변을 업데이트하십시오.

업데이트 : 문제 # 1956이 개발자에 의해 업데이트되었습니다. 이 기능은 2.4 릴리스에 포함되지 않았지만 곧 출시 될 2.7 릴리스로 연기되었습니다. 그것이 아직 문서화되지 않은 이유입니다.


I'm not sure why you would want to ignore the dependencies that your NuGet package requires to run, but have you thought about using the NuGet Package Explorer tool instead to create your package?

ReferenceURL : https://stackoverflow.com/questions/15012963/dont-include-dependencies-from-packages-config-file-when-creating-nuget-package

반응형