# swift package purge-cache

I explained in a [previous article](https://blog.eidinger.info/swift-package-manager-understand-resolve-reset-and-update) when to use `swift package reset`

> This will reset the complete cache/build directory. For SPM (command-line) this will affect the .build folder.

> The equivalent Xcode option is named "Reset Package Caches". This will affect the SourcePackages of the related folder in DerivedData.

If you run `swift package help` then you will see another subcommand called `purge-cache`. The description explains that the subcommand will `Purge the global repository cache`.

# What is this global repository cache and why does it exist?

Apple Swift Package Manager [introduced this cache](https://github.com/apple/swift-package-manager/blob/main/Documentation/ReleaseNotes/5.4.md#package-dependency-caching), to improve the handling package dependencies used in multiple packages, in Swift 5.4.

> Swift Package Manager now caches package dependency repositories on a per-user basis, which reduces the amount of network traffic and increases performance of dependency resolution for subsequent uses of the same package.

Default location on macOS is `/Users/<YourUserName>/Library/Caches/org.swift.swiftpm/repositories`

A quick summary: a package dependency, even when used in various packages, gets cloned only once into the cache and then source code can be copied to the `.build` cache when `swift package resolve` runs on a package using this package dependency. Making resolving faster.

You can learn more by reading the source code or the related pull request.

%[https://github.com/apple/swift-package-manager/pull/2985]

# When would you need to purge this global repository cache?

Only in extreme cases, for example when the repository structure gets irreversible re-structured.

In most cases `swift package reset` + `swift package resolve` or `swift package update` are sufficient.

It is NOT necessary to purge the  global repository cache even in situations in which your package dependency is pinned to a specific version and this tag gets deleted in the upstream repo and then re-created on a new commit. You can run `swift package reset` and delete `Package.resolved` file to pull in the expected changes with the next `swift package resolve`.



