The Manifest File of The Swift Package Manager #swiftlang

πŸ₯ž
2 min readApr 3, 2016

--

I have a strong interest in the Swift Package Manager (SwiftPM). 😁

Because I enjoy watching a process building something. πŸ‘€

By the way, I tried to understand the settings of the manifest file called Package.swift.

I don't have the best solution yet, but I have some instances and failures.

Please note!

The Swift Package Manager is still in early design and development

https://github.com/apple/swift-package-manager/blob/master/README.md

So this way will be out of date. πŸ™ƒ

Instances

  1. My project name is MyProject.
  2. MyProject depends on Pokemon Package.

The manifest file of MyProject

import PackageDescription

let package = Package(
name: "MyProject",
dependencies: [
.Package(url: "…/Pokemon/Pokemon.git",
versions: Version(1, 0, 0)..<Version(2, 0, 0))
],
targets: [
Target(name: "MyProject")
]
)

The manifest file of Pokemon

import PackageDescription

let package = Package(
name: "Pokemon"
)

or

import PackageDescription

let package = Package(
name: "Pokemon",
targets: [
Target(name: "Pokemon")
]
)

Xcode project

This is one Xcode project after running `$ swift buid` and `$ swift build -X`.

We can see the following generated things:

  • Each of Package Modules in Sources
  • Each of Packages Targets
  • Target Dependencies
  • Link Binary With Libraries

Failures

Case 1:

import PackageDescription

let package = Package(
name: "MyProject",
dependencies: [
.Package(url: β€œβ€¦/Pokemon/Pokemon.git",
versions: Version(1, 0, 0)..<Version(2, 0, 0))
],
targets: [
Target(
name: "Myproject",
dependencies: ["Pokemon"]
),
Target(name: "Pokemon")
]
)

This way, it's necessary to make Pokemon directory including a Swift file in Sources/ directory to generate Pokemon target.

But in fact, it’s unnecessary. πŸ™„

Case 2:

Remove Target(name: β€œPokemon”) from Case 1.

import PackageDescription

let package = Package(
name: "MyProject",
dependencies: [
.Package(url: "…/Pokemon/Pokemon.git",
versions: Version(1, 0, 0)..<Version(2, 0, 0))
],
targets: [
Target(
name: "Myproject",
dependencies: ["Pokemon"]
)
]
)

This way, an error has occured. 🚨

error: ModuleNotFound("Pokemon")

It’s necessary to have some modules in the Sources/ directory.

Remove dependencies: [β€œPokemon”]. πŸ’

Case 3:

If Documentation/ directory has no Swift file, we need to set exclude.

import PackageDescription

let package = Package(
name: "MyProject",
dependencies: [
.Package(url: "…/Pokemon/Pokemon.git",
versions: Version(1, 0, 0)..<Version(2, 0, 0))
],
targets: [
Target(name: "MyProject")
],
exclude: ["Documentation"]
)

Otherwise, an error has occured. 🚨

error: NoSources("/.../Documentation")

Thank you for reading it to the end. 😊

--

--