项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)...
?
知道了 csproj 文件中的一些常用 NuGet 屬性,創建 NuGet 包時就可以充分發揮新 Sdk 自動生成 NuGet 包的優勢,不需要 nuspec 文件啦。(畢竟 nuspec 文件沒有 .csproj 和 .targets 文件強大而又有擴展性。)
“項目文件中的已知屬性系列”分為兩個部分:
- 項目文件中的已知屬性(知道了這些,就不會隨便在 csproj 中寫死常量啦) - 呂毅
- 本文:項目文件中的已知 NuGet 屬性(使用這些屬性,創建 NuGet 包就可以不需要 nuspec 文件啦) - 呂毅
NuGet 相關的屬性也分為全局屬性和項屬性兩類。不過,我更愿意分成三類來說明:
nuspec 屬性
當然,這部分的屬性也是在 csproj 中使用的,是為了生成 nuspec 文件。
使用方法像這樣:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><PackageId>Walterlv.Demo</PackageId><PackageVersion>3.2.0-beta</PackageVersion><TargetFramework>net46</TargetFramework></PropertyGroup> </Project>不過我們通常沒有這么直接去設置,因為大多數屬性都是有默認值的,如果不設置,將自動使用默認值。甚至什么都不寫也能生成正確的 nuspec 文件。
- $(PackageId): NuGet 包的唯一 Id,對應 NuGet 的 Id 屬性。這個 Id 需要在整個服務器(例如 nuget.org)上唯一,如果沒設置,則使用 $(AssemblyName);例如 Newtonsoft.Json。
- $(PackageVersion): NuGet 包的包版本,可以使用語義版本號(參見語義版本號(Semantic Versioning) - 呂毅),如果沒設置,則使用 $(Version);例如 3.2.0-beta。
- $(PackageVersionPrefix): 包版本前綴,默認為空。
- $(PackageVersionSuffix): 包版本后綴,默認為空。
- $(Authors): 包的作者;建議指定成在 nuget.org 上的用戶名,這樣訪客可以點擊包作者查看到包作者的信息;多個名字用分號分隔。
- $(Title): 包的顯示名稱,如果沒設置,則使用 $(PackageId)。
- $(PackageDescription): 包的描述文字,如果填寫了,則用戶在瀏覽包的時候可以看到。
- $(Copyright): 包的版權聲明
- $(PackageRequireLicenseAcceptance): 是個布爾值,如果為 true,則在安裝包之前要求同意協議。
- $(PackageLicenseUrl): 此 NuGet 包協議所在的 url。
- $(PackageProjectUrl): 此 NuGet 包的項目 url。
- $(PackageIconUrl): 此 NuGet 包的圖標 url,無論是 nuget.org 還是 Visual Studio 都將從這個 url 下載包的圖標。
- $(PackageTags): 標簽,用分號分隔;指定多個標簽有助于用戶在 nuget.org 上搜索到你的 NuGet 包。
- $(PackageReleaseNotes): 這個版本的 Release 記錄。
- $(RepositoryUrl): 倉庫 url,例如 https://github.com/dotnet-campus/MSTestEnhancer.git
- $(RepositoryType): 倉庫類型,例如 git、tfs。
- $(RepositoryBranch): NuGet 4.7 才開始的新屬性!此包對應的倉庫分支,例如 master。
- $(RepositoryCommit): NuGet 4.7 才開始的新屬性!此包對應的提交號,例如 2d3ef96ee704d7896eeb2d88fbc987b2004ff786。
- $(PackageType): 我還沒有理解到此屬性的作用。
以上有些信息在每次 NuGet 發布之前都是要改的,例如:$(PackageVersion)、$(PackageReleaseNotes)、$(RepositoryCommit)。所以很明顯——這不是用來給開發者設置的屬性,是用于輔助我們生成打包工具的。
配置屬性
這些屬性會影響生成 NuGet 包的過程。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><!-- 此程序集不可打包,通常在單元測試項目中設置此屬性。 --><IsPackable>false<IsPackable><Description><Description><DevelopmentDependency><DevelopmentDependency><PackageOutputPath><PackageOutputPath><!-- 如果指定為 true,那么還會額外生成 PackageId.symbols.nupkg 包,除了原有包的內容外,還額外包含全部的輸出文件,以及源碼和項目文件,用于調試。 --><IncludeSymbols>true<IncludeSymbols><!-- 大致與 IncludeSymbols 相同,不過只會額外把 pdb 和 Compile 類型的文件打包到 NuGet 包中。如果使用 ProjectReference 引用的項目沒有指定 TreatAsPackageReference=false,也會一起被打包。 --><IncludeSource>true<IncludeSource><PackageTypes><PackageTypes><!-- 如果指定為 true,那么生成的 dll 將拷貝到 NuGet 包的 tools 目錄下。 --><IsTool>true<IsTool><!-- 如果 lib/**/*dll 中沒有發現 dll,NuGet 打包過程中會有警告;將這個屬性設為 true 可以禁用警告;這在制作純工具型 NuGet 包是非常有用。 --><NoPackageAnalysis>true<NoPackageAnalysis><MinClientVersion><MinClientVersion><IncludeContentInPack><IncludeContentInPack><!-- 默認情況下,項目輸出的 dll 會被打包到 lib 目錄下;設置了此屬性后,就可以打包到其他目錄下了。此例打包到 task 目錄下 --><BuildOutputTargetFolder>tasks<BuildOutputTargetFolder><ContentTargetFolders><ContentTargetFolders><!-- 以下屬性都是為了使用單獨的 nuspec 文件而準備的;如果不使用 nuspec 文件,通常無需設置這些屬性。 --><!-- 默認情況下,使用 dotnet pack 打 NuGet 包時,也會順便編譯;但設置此值為 true 后,就會像 nuget.exe 那樣不進行編譯了。 --><NoBuild>true</NoBuild><!-- 默認是 true,如果指定為 false,那么項目編譯輸出的 dll 文件將不會被打包到 NuGet 包中。 --><IncludeBuildOutput>false<IncludeBuildOutput><!-- 如果需要額外手工編寫 nuspec 文件,那么使用此屬性指定絕對或相對路徑。 --><NuspecFile>Walterlv.Demo.nuspec<NuspecFile><!-- 生成的屬性可以時 nuspec 文件中的占位符生效,例如 <file src="$SampleProperty$" target="src/" /> --><NuspecProperties>SampleProperty=Program.cs<NuspecProperties><!-- 如果 NuspecFile 使用相對路徑,那么就會相對于此路徑;通常不需要指定。 --><NuspecBasePath><NuspecBasePath></PropertyGroup> </Project>以上沒有設置值和注釋的屬性,我正在查閱資料。
項屬性
文件
為了脫離 nuspec 文件來打包,csproj 中需要對特殊用途的文件設置特別的 NuGet 屬性。
例如 Pack 屬性可以額外指定一或一組通配符文件需要被打包到 NuGet 包中;PackagePath 則指定了打包到 NuGet 包的路徑(NuGet 會通過擴展名來自動識別這是文件夾還是文件,所以可以通過這個屬性來重新指定名稱,但無法重新指定擴展名)。
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><Content Include="readme.txt"><Pack>true</Pack><PackagePath>\</PackagePath></Content><Content Include="PackageId.targets"><Pack>true</Pack><PackagePath>buildMultiTargeting\</PackagePath></Content></PropertyGroup> </Project>引用
引用中也可以加入一些 NuGet 包的生成屬性。
無論是 <ProjectReference /> 還是 <PackageReference />,都可以額外加上 <IncludeAssets> <ExcludeAssets> <PrivateAssets> 屬性。
使用方法類似這樣:
<PackageReference Include="Walterlv.Demo" Version="3.0.0-beta"><IncludeAssets>all</IncludeAssets><ExcludeAssets>contentFiles</ExcludeAssets><PrivateAssets>contentFiles;analyzers</PrivateAssets> </PackageReference>或者這樣:
<PackageReference Include="Walterlv.Demo" Version="3.0.0-beta" PrivateAssets="all" />不區分大小寫。
- <IncludeAssets> 引用的項目或包中的指定部分是本項目的依賴項。默認為 all。
- <ExcludeAssets> 引用的項目或包中的指定部分不是本項目的依賴項,應該排除。默認為 none。
- <PrivateAssets> 引用的項目或包中的指定部分依然是本項目的依賴項,但是在打 NuGet 包時不作為依賴項(不會傳遞到下一個項目)。默認為 contentfiles;analyzers;build。
如果你正試圖用 NuGet 編寫一個編譯時工具,那么,你可能需要在所有引用的最后加上如下行,將所有的包引用都設為 PrivateAssets。
<PackageReference Update="@(PackageReference)" PrivateAssets="All" />如果你希望了解 Reference PackageReference 以及上面 @ 的含義,可以閱讀我的另一篇文章:理解 C# 項目 csproj 文件格式的本質和編譯流程 - walterlv。
參考資料
- NuGet pack and restore as MSBuild targets - Microsoft Docs
- NuGet PackageReference format (package references in project files) - Microsoft Docs
轉載于:https://www.cnblogs.com/walterlv/p/10236460.html
總結
以上是生活随笔為你收集整理的项目文件中的已知 NuGet 属性(使用这些属性,创建 NuGet 包就可以不需要 nuspec 文件啦)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三周总结CoreIDRAW
- 下一篇: [BZOJ 1879][SDOI 200