Managing your project¶
The Swift Package Manager (SPM for short) is used for building your project's source code and dependencies. It's a similar idea to Cocoapods, Ruby gems, and NPM. Most of the time the Vapor Toolbox will interact with SPM on your behalf. However, it's important to understand the basics.
Learn more about SPM on Swift.org →
The first place SPM looks in your project is the package manifest. This should always be located in the root
directory of your project and named
Dependencies are other SPM packages that your package relies on. All Vapor applications rely on the Vapor package, but you can add as many other dependencies as you want.
// swift-tools-version:4.0 import PackageDescription let package = Package( name: "VaporApp", dependencies: [ // 💧 A server-side Swift web framework. .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"), ], targets: [ ... ] )
In the above example, you can see vapor/vapor → version 3.0 or later is a dependency of this package. When you add a dependency to your package, you must next signal which targets depend on the newly available modules.
Anytime you modify the package manifest, call
vapor update to effect the changes.
Targets are all of the modules, executables, and tests that your package contains.
// swift-tools-version:4.0 import PackageDescription let package = Package( name: "VaporApp", dependencies: [ ... ], targets: [ .target(name: "App", dependencies: ["Vapor"]), .target(name: "Run", dependencies: ["App"]), .testTarget(name: "AppTests", dependencies: ["App"]), ] )
Most Vapor apps will have three targets, although you can add as many as you like to organize your code.
Each target declares which modules it depends on. You must add module names here in order to
import them in your code.
A target can depend on other targets in your project or any modules exposed by packages you've added to
the main dependencies array.
Executable targets (targets that contain a
main.swift file) cannot be imported by other modules.
This is why Vapor has both an
App and a
Any code you include in
App can be tested in the
Below is the typical folder structure for an SPM package.
. ├── Sources │ ├── App │ │ └── (Source code) │ └── Run │ └── main.swift ├── Tests │ └── AppTests └── Package.swift
.target corresponds to a folder in the
.testTarget corresponds to a folder in the
If you are experiencing problems with SPM, sometimes cleaning your project can help.