# The `stack upload` command ~~~text stack upload [ITEM] [-d|--documentation] [--pvp-bounds PVP-BOUNDS] [--ignore-check] [--[no-]test-tarball] [--tar-dir ARG] [--candidate] [--setup-info-yaml URL] [--snapshot-location-base URL] ~~~ By default: * the command uploads one or more packages. Pass the flag `--documentation` (`-d` for short) to upload documentation for one or more packages; and * the upload is a package to be published or documentation for a published package. Pass the flag `--candidate` to upload a [package candidate](http://hackage.haskell.org/upload#candidates) or documentation for a package candidate. At least one `ITEM` must be specified. For example, if the current working directory is a package directory: ~~~text stack upload . ~~~ ## Upload one or more packages Hackage accepts packages for uploading in a standard form, a compressed archive ('tarball') in the format produced by Cabal's `sdist` action. If `ITEM` is a relative path to an sdist tarball, `stack upload` uploads the package to Hackage. If `ITEM` is a relative path to a package directory, `stack upload` generates a file for your package, in the format accepted by Hackage for uploads, and uploads the package to Hackage. By default: * the command will check each package for common mistakes. Pass the flag `--ignore-check` to disable such checks; * Stack will not test the resulting package archive. Pass the flag `--test-tarball` to cause Stack to test each resulting package archive, by attempting to build it. The `--pvp-bounds ` option determines whether and, if so, how PVP version bounds should be added to the Cabal file of the package. The available modes for basic use are: `none`, `lower`, `upper`, and `both`. The available modes for use with Cabal file revisions are `lower-revision`, `upper-revision` and `both-revision`. For futher information, see the [YAML configuration](yaml_configuration.md#pvp-bounds) documentation. The `--tar-dir ` option determines whether the package archive should be copied to the specified directory. ## Upload documentation for a package :octicons-beaker-24: Experimental :octicons-tag-24: UNRELEASED Hackage accepts documentation for a package for uploading in a standard form and in a compressed archive ('tarball') in the `.tar.gz` format. For further information about how to create such an archive file, see the documentation for the [`stack haddock --haddock-for-hackage`](build_command.md#-no-haddock-for-haddock-flag) command. If `ITEM` is a relative path to a package directory, `stack upload --documentation` uploads an existing archive file of documentation for the specified package to Hackage. If the `--documentation` flag is passed then flags specific to package upload are ignored. ## The `HACKAGE_USERNAME` and `HACKAGE_PASSWORD` environment variables [:octicons-tag-24: 2.3.1](https://github.com/commercialhaskell/stack/releases/tag/v2.3.1) `stack upload` will request a Hackage username and password to authenticate. This can be avoided by setting the `HACKAGE_USERNAME` and `HACKAGE_PASSWORD` environment variables. For example: === "Unix-like" ~~~text export $HACKAGE_USERNAME="" export $HACKAGE_PASSWORD="" stack upload . ~~~ === "Windows (with PowerShell)" ~~~text $Env:HACKAGE_USERNAME='' $Env:HACKAGE_PASSWORD='' stack upload . ~~~ ## The `HACKAGE_KEY` environment variable [:octicons-tag-24: 2.7.5](https://github.com/commercialhaskell/stack/releases/tag/v2.7.5) Hackage allows its members to register an API authentification token and to authenticate using the token. A Hackage API authentification token can be used with `stack upload` instead of username and password, by setting the `HACKAGE_KEY` environment variable. For example: === "Unix-like" ~~~text HACKAGE_KEY= stack upload . ~~~ === "Windows (with PowerShell)" ~~~text $Env:HACKAGE_KEY= stack upload . ~~~