{"id":458,"date":"2026-10-14T12:51:04","date_gmt":"2026-10-14T12:51:04","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2015\/11\/21\/how-to-publish-a-nuget-package-in-nuget-gallery\/"},"modified":"2026-10-14T12:51:04","modified_gmt":"2026-10-14T12:51:04","slug":"how-to-publish-a-nuget-package-in-nuget-gallery","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-publish-a-nuget-package-in-nuget-gallery\/","title":{"rendered":"Publish NuGet Packages to NuGet.org: CLI Steps, Workflow, and CI Example"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2015-11-21; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide shows how to publish a <code>.nupkg<\/code> file to NuGet.org from the command line. It is aimed at .NET developers and DevOps engineers who need a clear manual process and a simple path to automation.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2015\/11\/how-to-publish-a-nuget-pack.png\" alt=\"publish-a-nuget-package-in-nuget-gallery\" width=\"600\" height=\"400\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">What you need before publishing<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>A NuGet.org account at <a href=\"https:\/\/www.nuget.org\/\">nuget.org<\/a>.<\/li><li>An API key generated from your NuGet.org account settings.<\/li><li>A package file ending in <code>.nupkg<\/code> (built from your project).<\/li><li>Either <code>nuget.exe<\/code> or the <code>dotnet<\/code> CLI installed on the machine that will publish.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">NuGet publishing workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Create NuGet account] --> B[Generate API key]\n    B --> C[Build and pack project]\n    C --> D[Prepare publish command]\n    D --> E[Push nupkg to nuget.org]\n    E --> F{Accepted by feed}\n    F -- yes --> G[Install by package id and version]\n    F -- no --> H[Fix metadata or version]\n    H --> C\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Publish with nuget.exe (classic CLI)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post used <code>nuget.exe<\/code>. The same core flow still applies: store an API key, then push the package.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Store your API key on this machine<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">nuget setApiKey YOUR_NUGET_API_KEY<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This saves the key locally so you do not need to provide it every time on the same machine.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Push the package<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">nuget push YourPackage.nupkg -Source https:<span class=\"hljs-comment\">\/\/api.nuget.org\/v3\/index.json<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Publish with dotnet CLI (cross-platform)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If your build already uses the .NET SDK, you can publish with <code>dotnet nuget push<\/code> and pass the API key directly.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">dotnet nuget push .\/artifacts\/YourPackage<span class=\"hljs-number\">.1<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>.nupkg --source https:<span class=\"hljs-comment\">\/\/api.nuget.org\/v3\/index.json --api-key YOUR_NUGET_API_KEY<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">nuget.exe vs dotnet CLI<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Option<\/th><th>Typical push command<\/th><th>Best for<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>nuget.exe<\/td><td><code>nuget push YourPackage.nupkg -Source https:\/\/api.nuget.org\/v3\/index.json<\/code><\/td><td>Teams already using NuGet CLI workflows<\/td><td>Can store API key once with <code>nuget setApiKey<\/code>.<\/td><\/tr><tr><td>dotnet CLI<\/td><td><code>dotnet nuget push ... --source https:\/\/api.nuget.org\/v3\/index.json --api-key ...<\/code><\/td><td>SDK-style .NET projects and cross-platform CI<\/td><td>Fits naturally into <code>dotnet<\/code>-based build pipelines.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">CI-friendly example<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This example packs a project and publishes all generated packages. The API key is read from an environment variable (for example, from your CI secret store).<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-comment\">#!\/usr\/bin\/env bash<\/span>\nset -euo pipefail\n\ndotnet pack .\/src\/MyLibrary\/MyLibrary.csproj -c Release -o .\/artifacts\n\ndotnet nuget push <span class=\"hljs-string\">\".\/artifacts\/*.nupkg\"<\/span> \\\n  --source <span class=\"hljs-string\">\"https:\/\/api.nuget.org\/v3\/index.json\"<\/span> \\\n  --api-key <span class=\"hljs-string\">\"$NUGET_API_KEY\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Verify the package after publishing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After publish completes, verify consumers can resolve the package and version from NuGet.org.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">dotnet<\/span> <span class=\"hljs-selector-tag\">add<\/span> <span class=\"hljs-selector-tag\">package<\/span> <span class=\"hljs-selector-tag\">YourPackage<\/span> <span class=\"hljs-selector-tag\">--version<\/span> 1<span class=\"hljs-selector-class\">.0<\/span><span class=\"hljs-selector-class\">.0<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Reference<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Original reference from the post: <a href=\"https:\/\/docs.nuget.org\/consume\/command-line-reference\">https:\/\/docs.nuget.org\/consume\/command-line-reference<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Use a new package version for each release.<\/li><li>Keep API keys in a secret manager; do not commit them to source control.<\/li><li>Use the explicit NuGet.org source URL in automation for predictable behavior.<\/li><li>Perform a quick install test after publish to confirm package availability.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to publish a NuGet package to NuGet.org using either nuget.exe or the dotnet CLI. This revised guide includes a workflow diagram, command comparison, and a CI-friendly example.<\/p>\n","protected":false},"author":1,"featured_media":3150,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[1332,1122,545,1335,933,1334,1333,247,1337,593,1331,1338,1336,732,213],"class_list":["post-458","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-gallery","tag-guide","tag-how","tag-how-to-publish-nuget-package","tag-nuget","tag-nuget-gallery","tag-nuget-package","tag-package","tag-package-to-nuget-gallery","tag-process","tag-publish","tag-publish-command","tag-publish-the-package-on-the-nuget-gallery","tag-steps","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=458"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions"}],"predecessor-version":[{"id":79333,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/458\/revisions\/79333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3150"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}