Swiftpack.co - Package - danger/swift

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.


⚠️ Stop saying "you forgot to …" in code review

Formalize your Pull Request etiquette.

Write your Dangerfiles in Swift.


Latest version requires Swift 5.1

  • If you are using Swift 4.2 use v2.0.7
  • If you are using Swift 4.1 use v0.4.1
  • If you are using Swift 4.0, Use v0.3.6

What it looks like today

You can make a Dangerfile that looks through PR metadata, it's fully typed.

import Danger

let danger = Danger()
let allSourceFiles = danger.git.modifiedFiles + danger.git.createdFiles

let changelogChanged = allSourceFiles.contains("CHANGELOG.md")
let sourceChanges = allSourceFiles.first(where: { $0.hasPrefix("Sources") })

if !changelogChanged && sourceChanges != nil {
  warn("No CHANGELOG entry added.")

// You can use these functions to send feedback:
message("Highlight something in the table")
warn("Something pretty bad, but not important enough to fail the build")
fail("Something that must be changed")

markdown("Free-form markdown that goes under the table, so you can do whatever.")

Using Danger Swift

All of the docs are on the user-facing website: https://danger.systems/swift/


  • danger-swift ci - Use this on CI
  • danger-swift pr https://github.com/Moya/Harvey/pull/23 - Use this to build your Dangerfile
  • danger-swift local - Use this to run danger against your local changes from master
  • danger-swift edit - Creates a temporary Xcode project for working on a Dangerfile


Infrastructure exists to support plugins, which can help you avoid repeating the same Danger rules across separate repos.

e.g. A plugin implemented with the following at https://github.com/username/DangerPlugin.git.

// DangerPlugin.swift
import Danger

public struct DangerPlugin {
    let danger = Danger()
    public static func doYourThing() {
        // Code goes here

Swift Package Manager (More performant)

You can use Swift PM to install both danger-swift and your plugins:

  • Install Danger JS

    $ npm install -g danger
  • Add to your Package.swift:

    let package = Package(
        products: [
            .library(name: "DangerDeps[Product name (optional)]", type: .dynamic, targets: ["DangerDependencies"]), // dev
        dependencies: [
            .package(url: "https://github.com/danger/swift.git", from: "3.0.0"), // dev
            // Danger Plugins
            .package(url: "https://github.com/username/DangerPlugin.git", from: "0.1.0") // dev
        targets: [
            .target(name: "DangerDependencies", dependencies: ["Danger", "DangerPlugin"]), // dev
  • Add the correct import to your Dangerfile.swift:

    import DangerPlugin
  • Create a folder called DangerDependencies in Sources with an empty file inside like Fake.swift

  • To run Danger use swift run danger-swift command

  • (Recommended) If you are using Swift PM to distribute your framework, use Rocket, or a similar tool, to comment out all the dev dependencies from your Package.swift. This prevents these dev dependencies from being downloaded and compiled with your framework by consumers.

  • (Recommended) cache the .build folder on your repo

Marathon (Easy to use)

By suffixing package: [url] to an import, you can directly import Swift PM package as a dependency

For example, a plugin could be used by the following.

// Dangerfile.swift

import DangerPlugin // package: https://github.com/username/DangerPlugin.git


You can see an example danger-swift plugin.

(Recommended) Cache the ~/.danger-swift folder


For a Mac:

# Install danger-swift, and a bundled danger-js locally
brew install danger/tap/danger-swift
 # Run danger
danger-swift ci

For Linux:

# Install danger-swift
git clone https://github.com/danger/danger-swift.git
cd danger-swift
make install

# Install danger-js
npm install -g danger

 # Run danger
danger-swift ci


mint install danger/swift

GitHub Actions

You can add danger/swift to your actions

    runs-on: ubuntu-latest
    name: "Run Danger"
      - uses: actions/checkout@v1
      - name: Danger
        uses: danger/swift@3.3.0
            args: --failOnErrors --no-publish-check
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Danger has two different pre built images that you can use with your action:

In order to import one of those use the docker:// prefix

    runs-on: ubuntu-latest
    name: "Run Danger"
      - uses: actions/checkout@v1
      - name: Danger
        uses: docker://ghcr.io/danger/danger-swift:3.7.2
            args: --failOnErrors --no-publish-check
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Local compiled danger-js

To use a local compiled copy of danger-js use the danger-js-path argument:

danger-swift command --danger-js-path path/to/danger-js

Current working directory

Many people prefers using the SPM Danger configuration, because is more performing. But having a Package.swift on your root folder can be annoying, especially now that Xcode (from 11) doesn't put on the recents list an xcproj (or xcworkspace) when there is a Package.swift in the same folder. With the --cwd parameter you can specify a working directory. This allows you to have your Package.swift in another directory and still run danger-swift as it was executed from your project root directory.

swift run danger-swift command --cwd path/to/working-directory


You need to be using Xcode 10.

git clone https://github.com/danger/danger-swift.git
cd danger-swift
swift build
swift run komondor install
swift package generate-xcodeproj
open danger-swift.xcodeproj

Then I tend to run danger-swift using swift run:

swift run danger-swift pr https://github.com/danger/swift/pull/95

If you want to emulate how DangerJS's process will work entirely, then use:

swift build && cat Fixtures/eidolon_609.json | ./.build/debug/danger-swift


Run swift run rocket $VERSION on master e.g. swift run rocket 1.0.0


Danger Swift is maintained by @f-meloni, and maybe you?


Stars: 722
Last commit: Yesterday


3.0.0 Release - 2020-01-13T09:32:37

  • Danger dependencies manager [@f-meloni][] - #303
  • Update swift toolchain to 5.0 [@f-meloni][] - #307
  • Move to swift 5.1 [@f-meloni][] - #275
  • Add a new LintStyle enum to be able to also lint a specific set of files with SwiftLint [@avdlee][] - #308