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
Eureka MIT
Firebase Apache
GoogleAppMeasurement Apache
GoogleDataTransport Apache
GoogleUtilities MIT
gRPC Apache
GTMSessionFetcher Apache
Kanna MIT
KeychainAccess MIT
Kingfisher MIT
leveldb BSD
LicenseChecker unknown
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.0+
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.0.0/license-checker-macos.artifactbundle.zip", checksum: "7574f78ed51838fc690bf87ec317cb5acbff5bfb533bbd308c6865a2a6455eab" ), .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]
⚠️
white-list.json
must be included in Target Membership.
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.0.0/license-checker-macos.artifactbundle.zip", checksum: "7574f78ed51838fc690bf87ec317cb5acbff5bfb533bbd308c6865a2a6455eab" ), .plugin( name: "LicenseCheckerPlugin", capability: .buildTool(), dependencies: [ .target(name: "license-checker") ] ) ]
-
Code
Plugins/LicenseCheckerPlugin/main.swift
.import Foundation import PackagePlugin @main struct LicenseCheckerPlugin: BuildToolPlugin { func createBuildCommands(context: PluginContext, target: Target) async throws -> [Command] { let whiteListPath = "Path to white-list.json" // Please change accordingly. let pluginWorkDirectory = context.pluginWorkDirectory.string let regex = try NSRegularExpression(pattern: ".*SourcePackages") let range = NSMakeRange(0, pluginWorkDirectory.utf16.count) guard let result = regex.firstMatch(in: pluginWorkDirectory, range: range) else { throw NSError(domain: "com.cybozu.LicenseCheckerPlugin", code: 1, userInfo: ["message": "Failed to match"]) } let sourcePackageDirectory = NSString(string: pluginWorkDirectory) .substring(with: result.range(at: 0)) return [ .prebuildCommand( displayName: "LicenseChecker", executable: try context.tool(named: "license-checker").path, arguments: [ "--source-packages-path", sourcePackageDirectory, "--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 of SourcePackages directory
-w, --white-list-path <white-list-path>
Path of white-list.json
--version Show the version.
-h, --help Show help information.