文章分類
.NET 5
.NET Core
.NET FrameWork
3C
工作室佈告欄
心理探討
專案測試
軟體工程
開發流程
Agile
Algorithm
ALM
Android SDK
Angular
AngularJS
Architecture
ASP.NET
ASP.NET Core
Books
Bower
C#
C# (Extensions)
ChatBot
CLOUD
Comic
CSS
Dapper
Design Pattern
DevOps
Django
Docker
Domain Driven Design
Entity framework
EXCEL
Financial Derivatives
Firebase
Flask
Front-end
GIT
GitHub
Golang
GraphQL
Gulp
Identity Server
IIS
javascript
jQuery
Keyboard
L-I-F-E
LetsEncrypt
LINQ
LINUX
MongoDB
Multi-Thread
Nuget
Open Source
Oracle
OS
Performance issue
PostgreSQL
Project Management
Python
RabbitMQ
Redis
Redux
RxJS
SAP TM
Scrum
SEO
Sharepoint
Sql Server
SSRS
Study
Swagger
Team Foundation Server
TensorFlow
Testing
Toolkits
Tricking
Trouble Shooting
UML
Unit Test
Vim
Visual Studio
Visual SVN Server
VSCODE
Vue
Web Api
Web Service
WebStorm
Windows Application
WSL
2019年2月27日 星期三
2019年2月13日 星期三
[Nuget] Packing with Nuget CLI
Nuget dotnet core dotnet framework
▌Introduction
▌Environment
▋Visual Studio 2017 community
▋dotnet core 2.2.101
▋NuGet
4.9.2.5706
▌Implement
▋Decide what
will be packed
Follow the suggestions from Microsoft Document:
- Pack the libraries that have dependencies between them as a
Nuget Package
- For those independent libraries, pack them to separate Nuget
Packages
▋Create .nuspec
file
Go the the root path of target project,
$ nuget spec
This command will create a <project_name>.nuspec file into the
project. The file contains the following metadata:
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
<projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
<iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>Summary
of changes made in this release of the package.</releaseNotes>
<copyright>Copyright
2019</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
</package>
▋Update .nuspec file
We can update the right information on the .nuspec file or
l Use Replacement
tokens
l Pack cmd
with properties argument
▋Replacement tokens
dotnet framework
The supported Replacement tokens are as following,
Token
|
Value source
|
Value
|
$id$
|
Project file
|
AssemblyName
(title) from the project file
|
$version$
|
AssemblyInfo
|
AssemblyInformationalVersion
if defined, otherwise AssemblyVersion
|
$author$
|
AssemblyInfo
|
AssemblyCompany
|
$title$
|
AssemblyInfo
|
AssemblyTitle
|
$description$
|
AssemblyInfo
|
AssemblyDescription
|
$copyright$
|
AssemblyInfo
|
AssemblyCopyright
|
We can set the AssemblyInfo in Visual Studio,
dotnet core
Same as the ones of dotnet framework except $authors$
Token
|
Value
source
|
Value
|
$authors$
|
AssemblyInfo
|
AssemblyCompany
|
In dotnet core project, we can write/find the above informations in
project file or in Visual Studio: Project
properties->Package as
following,
This is an example for using Replacement
tokens in .nuspec file for dotnet core class library
project,
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$authors$</authors>
<owners>$authors$</owners>
<!--<license
type="file">LICENSE</license>-->
<license type="expression">MIT</license>
<projectUrl>https://github.com/KarateJB/JB.Infra</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>
v1.0.0.0
Awesome package(?)
</releaseNotes>
<copyright>$copyright$</copyright>
<tags>dotnetcore util ef</tags>
</metadata>
</package>
license tag allows the pattern:<license type="expression |
file" />
ex.
<license
type="expression">Apache-2.0</license>
<license type="file">LICENSE.txt</license>
(Supported format: .md, .txt)
Reference: Packaging
License within the nupkg
▋Pack cmd with properties argument
$ nuget pack -properties
<name>=<value>;<name>=<value>
For example,
$ nuget pack -properties tags="dotnetcore util";description="My nuget package"
▋Pack the library/libraries
$ nuget pack <nuspec_path |
project_path> [options] [-Properties ...]
For more options. see pack
command (NuGet CLI)
For example,
$ nuget pack ../xxx/xxx.csproj
PS. Notice that to
pack another project which has no .nuspec file will have some bugs, like the Author property will be
set to the value of Company from Project file.
Thus it's
recommanded to pack the project which has local `.nuspec` file.
|
Or the most useful case is set the configuration and version:
$ nuget pack xxx.csproj
-Properties Configuration=Release -Version 0.0.0.1
▋Demo
$ dotnet build --configuration
release
$ nuget pack JB.Infra.Util.csproj
-Properties Configuration=Release -Version 0.0.0.1
Result:
▋Set Dependencies information
<?xml version="1.0"?>
<package >
<metadata>
<!-- skip -->
<dependencies>
<dependency id="Microsoft.Extensions.Caching.Memory" version="2.2.0" />
<dependency id="Newtonsoft.Json" version="11.0.2" />
</dependencies>
</metadata>
</package>
▋Including License file
As mentioned above, we can use the file type as <license
type="file"> in .nuspec file.
But we have to define the file in the file list like following.
<?xml version="1.0"?>
<package >
<metadata>
<!-- skip -->
<license type="file">LICENSE.txt</license>
</metadata>
<files>
<file
src="LICENSE.txt" target="" />
</files>
</package>
Which will result in the following information on Nuget package,
▋Including assembly files
Specify the file list in .nuspec
to include other .dll/.pdb/... files into the package.
<?xml version="1.0"?>
<package >
<metadata>
<!-- skip -->
</metadata>
<files>
<file
src="LICENSE.txt" target="" />
<file
src="..\JB.Infra.Util.EF\bin\$configuration$\netstandard2.0\JB.Infra.Util.EF.dll" target="lib\netstandard2.0\JB.Infra.Util.EF.dll" />
<file
src="..\JB.Infra.Util.EF\bin\$configuration$\netstandard2.0\JB.Infra.Util.EF.xml" target="lib\netstandard2.0\JB.Infra.Util.EF.xml" />
<file
src="..\JB.Infra.Util.Logging\bin\$configuration$\netstandard2.0\JB.Infra.Util.Logging.dll" target="lib\netstandard2.0\JB.Infra.Util.Logging.dll" />
<file
src="..\JB.Infra.Util.Logging\bin\$configuration$\netstandard2.0\JB.Infra.Util.Logging.xml" target="lib\netstandard2.0\JB.Infra.Util.Logging.xml" />
</files>
</package>
▋Including content files
Sometimes we would like to have a content file to be installed into
the project which has installed our Nuget package.
For example, a NLog.config shall be installed as a content
file when the Logging package is installed.
Specify the key target path: contentFiles\any\any\<ContentFile>
like following, (DO NOT remove or modify contentFiles\any\any\!)
<?xml version="1.0"?>
<package >
<metadata>
<!-- skip -->
</metadata>
<files>
<file
src="..\JB.Infra.Util.Logging\NLog.config" target="contentFiles\any\any\NLog.config"/>
</files>
</package>
and the content file will be placed under the root directory of
project:
My final .nuspec file and the package
generated are as following,
▌Reference
訂閱:
文章 (Atom)