LicenseChecker
LicenseChecker is a command line tool checking licenses of swift package libraries that your app depends on.
It can detect libraries that are not included in a whitelist specifying the license type or library name.
Execution Example
$ license-checker --source-packages-path ~/SourcePackages --white-list-path ~/white-list.json
✔︎ abseil Apache
✔︎ BoringSSL-GRPC BoringSSL
✔︎ Firebase Apache
✔︎ GoogleAppMeasurement Apache
✔︎ GoogleDataTransport Apache
✔︎ GoogleUtilities MIT
✔︎ gRPC Apache
✔︎ GTMSessionFetcher Apache
✔︎ Kanna MIT
✔︎ KeychainAccess MIT
✔︎ Kingfisher MIT
✔︎ leveldb BSD
✔︎ LicenseList MIT
✔︎ nanopb zlib
✔︎ ObjectMapper MIT
✔︎ Promises Apache
✔︎ R.swift.Library MIT
✔︎ Reachability MIT
✔︎ RxGesture MIT
✔︎ RxSwift MIT
✔︎ SwiftProtobuf Apache
✅ No problems with library licensing.
$
Requirements
- Written in Swift 5
- Compatible with macOS 12.0+
- Development with Xcode 14.2+
How to Use
- Prepare a white list (
white-list.json
).
- Specify the type of license to approve.
- Specify the name of library to approve (for private libraries).
LicenseChecker supports the following licenses:
license type | white list key |
---|---|
Apache license 2.0 | Apache |
MIT License | MIT |
BSD 3-clause Clear license | BSD |
zLib License | zlib |
BoringSSL | BoringSSL |
Sample of white-list.json
{
"licenses": [
"Apache",
"MIT",
"BSD",
"zlib",
"BoringSSL"
],
"libraries": [
"PrivateLibrary-Hoge"
]
}
CommandPlugin & Run Script in BuildPhases (for Xcode Project)
-
Add binary target & plugin to
Package.swift
.targets: [ .binaryTarget( name: "license-checker", url: "https://github.com/cybozu/LicenseChecker/releases/download/1.2.0/license-checker-macos.artifactbundle.zip", checksum: "4b3aacb1c2b2b91012db0b13680eba82f79a779c7271d086e12028901ada71b5" ), .plugin( name: "LicenseCheckerCommand", capability: .command( intent: .custom(verb: "license-checker", description: "Run LicenseChecker"), permissions: [] ), dependencies: ["license-checker"] ) ]
-
Code
Plugins/LicenseCheckerCommand/main.swift
.import Foundation import PackagePlugin @main struct LicenseCheckerCommand: CommandPlugin { func performCommand(context: PluginContext, arguments: [String]) async throws { let licenseCheckerPath = try context.tool(named: "license-checker").path.string let rswiftURL = URL(fileURLWithPath: licenseCheckerPath, isDirectory: false) let process = try Process.run(rswiftURL, arguments: arguments) process.waitUntilExit() if process.terminationReason != .exit || process.terminationStatus != 0 { Diagnostics.error("license-checker errors detected.") } } }
-
Add a Run Script in BuildPhases
SOURCE_PACKAGES_PATH=`echo ${BUILD_DIR%Build/*}SourcePackages` xcrun --sdk macosx swift package --package-path ./RoadWarriorPackages \ --allow-writing-to-directory ${SRCROOT} \ license-checker -s ${SOURCE_PACKAGES_PATH} -w [Path to white-list.json]
BuildToolPlugin (for Swift Package Project)
-
Add binary target & plugin to
Package.swift
.targets: [ .binaryTarget( name: "license-checker", url: "https://github.com/cybozu/LicenseChecker/releases/download/1.2.0/license-checker-macos.artifactbundle.zip", checksum: "4b3aacb1c2b2b91012db0b13680eba82f79a779c7271d086e12028901ada71b5" ), .plugin( name: "LicenseCheckerPlugin", capability: .buildTool(), dependencies: [ .target(name: "license-checker") ] ) ]
-
Code
Plugins/LicenseCheckerPlugin/main.swift
.import Foundation import PackagePlugin @main struct LicenseCheckerPlugin: BuildToolPlugin { enum LCError: Error { case sourcePackagesNotFound } func sourcePackages(_ pluginWorkDirectory: Path) throws -> Path { var tmpPath = pluginWorkDirectory guard pluginWorkDirectory.string.contains("SourcePackages") else { throw LCError.sourcePackagesNotFound } while tmpPath.lastComponent != "SourcePackages" { tmpPath = tmpPath.removingLastComponent() } return tmpPath } func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] { let executablePath = try context.tool(named: "license-checker").path let sourcePackagesPath = try sourcePackages(context.pluginWorkDirectory) let whiteListPath = "Path to white-list.json" // Please change accordingly. return [ .prebuildCommand( displayName: "Prepare LicenseList", executable: executablePath, arguments: [ "--source-packages-path", sourcePackagesPath.string, "--white-list-path", whiteListPath ], outputFilesDirectory: context.pluginWorkDirectory ) ] } }
-
Use plugin in the target (
Package.swift
).targets: [ .target( name: "SomeFeature", resources: [.process("white-list.json")], // Please change accordingly. plugins: [ .plugin(name: "LicenseCheckerPlugin") ] ) ]
license-checker (command help)
$ swift run license-checker -h
Building for debugging...
Build complete! (0.10s)
OVERVIEW: A tool to check license of swift package libraries.
USAGE: license-checker --source-packages-path <source-packages-path> --white-list-path <white-list-path>
OPTIONS:
-s, --source-packages-path <source-packages-path>
Path to SourcePackages directory
-w, --white-list-path <white-list-path>
Path to white-list.json
--version Show the version.
-h, --help Show help information.