--- title: Working with the NuGet registry intro: 'You can configure the `dotnet` command-line interface (CLI) to publish NuGet packages to {% data variables.product.prodname_registry %} and to use packages stored on {% data variables.product.prodname_registry %} as dependencies in a .NET project.' product: '{% data reusables.gated-features.packages %}' redirect_from: - /articles/configuring-nuget-for-use-with-github-package-registry - /github/managing-packages-with-github-package-registry/configuring-nuget-for-use-with-github-package-registry - /github/managing-packages-with-github-packages/configuring-nuget-for-use-with-github-packages - /github/managing-packages-with-github-packages/configuring-dotnet-cli-for-use-with-github-packages - /packages/using-github-packages-with-your-projects-ecosystem/configuring-dotnet-cli-for-use-with-github-packages - /packages/guides/configuring-dotnet-cli-for-use-with-github-packages versions: fpt: '*' ghes: '*' ghec: '*' shortTitle: NuGet registry --- {% data reusables.package_registry.packages-ghes-release-stage %} {% data reusables.package_registry.admins-can-configure-package-types %} {% ifversion ghec %} ## URL for the NuGet registry If you access {% data variables.product.github %} at {% data variables.product.prodname_dotcom_the_website %}, you will publish packages to https://nuget.pkg.github.com. Examples in this article use this URL. If you access {% data variables.product.github %} at another domain, such as `octocorp.ghe.com`, replace "https://nuget.pkg.github.com" with `https://nuget.SUBDOMAIN.ghe.com`, where `SUBDOMAIN` is your enterprise's unique subdomain. {% endif %} ## Authenticating to {% data variables.product.prodname_registry %} {% data reusables.package_registry.authenticate-packages %} ### Authenticating in a {% data variables.product.prodname_actions %} workflow {% ifversion packages-nuget-v2 %} This registry supports granular permissions. {% data reusables.package_registry.authenticate_with_pat_for_v2_registry %} {% endif %} Use the following command to authenticate to {% data variables.product.prodname_registry %} in a {% data variables.product.prodname_actions %} workflow using the `GITHUB_TOKEN` instead of hardcoding a {% data variables.product.pat_generic %} in a nuget.config file in the repository: ```shell dotnet nuget add source --username USERNAME --password {% raw %}${{ secrets.GITHUB_TOKEN }}{% endraw %} --store-password-in-clear-text --name github "https://{% ifversion fpt or ghec %}nuget.pkg.github.com{% else %}nuget.HOSTNAME{% endif %}/NAMESPACE/index.json" ``` Replace `NAMESPACE` with the name of the personal account or organization {% ifversion packages-nuget-v2 %}to which your packages are scoped{% else %}that owns the repository where your packages are hosted{% endif %}. Replace `USERNAME` with the username to be used when connecting to an authenticated source. {% ifversion packages-nuget-v2 %}{% else %}{% data reusables.package_registry.authenticate-packages-github-token %}{% endif %} {% ifversion packages-nuget-v2 %} {% data reusables.package_registry.v2-actions-codespaces %} {% endif %} ### Authenticating with a {% data variables.product.pat_generic %} {% data reusables.package_registry.authenticate-packages %} {% data reusables.package_registry.required-scopes %} To authenticate to {% data variables.product.prodname_registry %} with the `dotnet` command-line interface (CLI), create a _nuget.config_ file in your project directory specifying {% data variables.product.prodname_registry %} as a source under `packageSources` for the `dotnet` CLI client. You must replace: * `USERNAME` with the name of your personal account on {% data variables.product.prodname_dotcom %}. * `TOKEN` with your {% data variables.product.pat_v1 %}. * `NAMESPACE` with the name of the personal account or organization {% ifversion packages-nuget-v2 %}to which your packages are scoped{% else %}that owns the repository where your packages are hosted{% endif %}.{% ifversion ghes %} * `HOSTNAME` with the host name for {% data variables.location.product_location %}.{% endif %} {% ifversion ghes %}If your instance has subdomain isolation enabled: {% endif %} ```xml ``` {% ifversion ghes %} If your instance has subdomain isolation disabled: ```xml ``` {% endif %} ## Publishing a package {% ifversion packages-nuget-v2 %} > [!NOTE] > The `nupkg` archive for a NuGet package version must be smaller than 2.147 GB in size. {% endif %} You can publish a package to {% data variables.product.prodname_registry %} by authenticating with a _nuget.config_ file, using the `--api-key` command line option with your {% data variables.product.prodname_dotcom %} {% data variables.product.pat_v1 %} or by using command that can be run directly from the command line using the `dotnet` command-line interface (CLI). Replace `OWNER` with your username or company name, and `YOUR_GITHUB_PAT` with your {% data variables.product.pat_generic %}. ```shell dotnet nuget add source --username OWNER --password {% raw %}YOUR_GITHUB_PAT{% endraw %} --store-password-in-clear-text --name github "https://{% ifversion fpt or ghec %}nuget.pkg.github.com{% else %}nuget.HOSTNAME{% endif %}/OWNER/index.json" ``` {% ifversion packages-nuget-v2 %} The NuGet registry stores packages within your organization or personal account, and allows you to associate packages with a repository. You can choose whether to inherit permissions from a repository, or set granular permissions independently of a repository. {% data reusables.package_registry.publishing-user-scoped-packages %} For more information on linking a published package with a repository, see [AUTOTITLE](/packages/learn-github-packages/connecting-a-repository-to-a-package). If you specify a `RepositoryURL` in your project's _.csproj_ file, the published package will automatically be connected to the specified repository. For more information, see [AUTOTITLE](/packages/working-with-a-github-packages-registry/working-with-the-nuget-registry#publishing-a-package-using-a-nugetconfig-file). For information on linking an already-published package to a repository, see [AUTOTITLE](/packages/learn-github-packages/connecting-a-repository-to-a-package). {% endif %} ### Publishing a package using a GitHub {% data variables.product.pat_generic %} as your API key If you don't already have a {% data variables.product.pat_generic %} to use for your account on {% data variables.product.github %}, see [AUTOTITLE](/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token). 1. Create a new project. Replace `PROJECT_NAME` with the name you'd like to give the project. ```shell dotnet new console --name PROJECT_NAME ``` 1. Package the project. ```shell dotnet pack --configuration Release ``` 1. Publish the package using your {% data variables.product.pat_generic %} as the API key. Replace `PROJECT_NAME` with the name of the project, `1.0.0` with the version number of the package, and `YOUR_GITHUB_PAT` with your {% data variables.product.pat_generic %}. ```shell dotnet nuget push "bin/Release/PROJECT_NAME.1.0.0.nupkg" --api-key YOUR_GITHUB_PAT --source "github" ``` {% data reusables.package_registry.viewing-packages %} ### Publishing a package using a _nuget.config_ file When publishing, {% ifversion packages-nuget-v2 %}if you are linking your package to a repository, {% endif %}the `OWNER` of the repository specified in your _.csproj_ file must match the `NAMESPACE` that you use in your _nuget.config_ authentication file. Specify or increment the version number in your _.csproj_ file, then use the `dotnet pack` command to create a _.nuspec_ file for that version. For more information on creating your package, see [Create and publish a package](https://docs.microsoft.com/nuget/quickstart/create-and-publish-a-package-using-the-dotnet-cli) in the Microsoft documentation. {% data reusables.package_registry.auto-inherit-permissions-note %} {% data reusables.package_registry.authenticate-step %} 1. Create a new project. Replace `PROJECT_NAME` with the name you'd like to give the project. ```shell dotnet new console --name PROJECT_NAME ``` 1. Add your project's specific information to your project's file, which ends in _.csproj_. Make sure to replace: * `1.0.0` with the version number of the package. * `OWNER` with the name of the personal account or organization that owns the repository to which you want to {% ifversion packages-nuget-v2 %}link your package{% else %}publish your package{% endif %}. * `REPOSITORY` with the name of the repository to which you want to connect your package.{% ifversion ghes %} * `HOSTNAME` with the host name for {% data variables.location.product_location %}.{% endif %} ``` xml Exe netcoreapp3.0 PROJECT_NAME 1.0.0 AUTHORS COMPANY_NAME PACKAGE_DESCRIPTION https://{% ifversion fpt or ghec %}github.com{% else %}HOSTNAME{% endif %}/OWNER/REPOSITORY ``` 1. Package the project. ```shell dotnet pack --configuration Release ``` 1. Publish the package using the `key` you specified in the _nuget.config_ file. Replace `PROJECT_NAME` with the name of the project, and replace `1.0.0` with the version number of the package. ```shell dotnet nuget push "bin/Release/PROJECT_NAME.1.0.0.nupkg" --source "github" ``` {% data reusables.package_registry.viewing-packages %} ## Publishing multiple packages to the same repository To connect multiple packages to the same repository, use the same {% data variables.product.prodname_dotcom %} repository URL in the `RepositoryURL` fields in all _.csproj_ project files. {% data variables.product.prodname_dotcom %} matches the repository based on that field. The following example publishes the projects MY_APP and MY_OTHER_APP to the same repository: ``` xml Exe netcoreapp3.0 MY_APP 1.0.0 Octocat GitHub This package adds a singing Octocat! https://{% ifversion fpt or ghec %}github.com{% else %}HOSTNAME{% endif %}/my-org/my-repo ``` ``` xml Exe netcoreapp3.0 MY_OTHER_APP 1.0.0 Octocat GitHub This package adds a dancing Octocat! https://{% ifversion fpt or ghec %}github.com{% else %}HOSTNAME{% endif %}/my-org/my-repo ``` ## Installing a package Using packages from {% data variables.product.prodname_dotcom %} in your project is similar to using packages from _nuget.org_. Add your package dependencies to your _.csproj_ file, specifying the package name and version. For more information on using a _.csproj_ file in your project, see [Working with NuGet packages](https://docs.microsoft.com/nuget/consume-packages/overview-and-workflow) in the Microsoft documentation. {% data reusables.package_registry.authenticate-step %} 1. To use a package, add `ItemGroup` and configure the `PackageReference` field in the _.csproj_ project file. Replace the `PACKAGE_NAME` value in `Include="PACKAGE_NAME"` with your package dependency, and replace the `X.X.X` value in `Version="X.X.X"` with the version of the package you want to use: ``` xml Exe netcoreapp3.0 My-app 1.0.0 Octocat GitHub This package adds an Octocat! https://{% ifversion fpt or ghec %}github.com{% else %}HOSTNAME{% endif %}/OWNER/REPOSITORY ``` 1. Install the packages with the `restore` command. ```shell dotnet restore ``` ## Troubleshooting {% ifversion packages-nuget-v2 %}{% else %}Your NuGet package may fail to push if the `RepositoryUrl` in _.csproj_ is not set to the expected repository. If you're using a nuspec file, ensure that it has a `repository` element with the required `type` and `url` attributes.{% endif %} If you're using a `GITHUB_TOKEN` to authenticate to a {% data variables.product.prodname_registry %} registry within a {% data variables.product.prodname_actions %} workflow, the token cannot access private repository-based packages in a different repository other than where the workflow is running in. To access packages associated with other repositories, instead generate a {% data variables.product.pat_v1 %} with the `read:packages` scope and pass this token in as a secret. ## Further reading * [AUTOTITLE](/packages/learn-github-packages/deleting-and-restoring-a-package)