From 344c85569447c4c941a445bcd12d6533a75f39aa Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Mon, 24 Mar 2025 01:11:07 +0000 Subject: [PATCH] Add `--configuration` option to `swift package js` command If we pass `-c release` as `swift package` option, command plugins will also be built in release configuration, which is not what we want. --- Plugins/PackageToJS/Sources/PackageToJS.swift | 2 + .../Sources/PackageToJSPlugin.swift | 56 ++++++++++++------- Plugins/PackageToJS/Tests/ExampleTests.swift | 2 +- 3 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Plugins/PackageToJS/Sources/PackageToJS.swift b/Plugins/PackageToJS/Sources/PackageToJS.swift index 5f66a28a..0402c745 100644 --- a/Plugins/PackageToJS/Sources/PackageToJS.swift +++ b/Plugins/PackageToJS/Sources/PackageToJS.swift @@ -4,6 +4,8 @@ struct PackageToJS { struct PackageOptions { /// Path to the output directory var outputPath: String? + /// The build configuration to use (default: debug) + var configuration: String? /// Name of the package (default: lowercased Package.swift name) var packageName: String? /// Whether to explain the build plan (default: false) diff --git a/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift b/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift index 5f257079..6ace4b72 100644 --- a/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift +++ b/Plugins/PackageToJS/Sources/PackageToJSPlugin.swift @@ -316,8 +316,17 @@ struct PackageToJSPlugin: CommandPlugin { ) throws -> PackageManager.BuildResult { + let buildConfiguration: PackageManager.BuildConfiguration + if let configuration = options.configuration { + guard let _buildConfiguration = PackageManager.BuildConfiguration(rawValue: configuration) else { + fatalError("Invalid build configuration: \(configuration)") + } + buildConfiguration = _buildConfiguration + } else { + buildConfiguration = .debug + } var parameters = PackageManager.BuildParameters( - configuration: .inherit, + configuration: buildConfiguration, logging: options.verbose ? .verbose : .concise ) parameters.echoLogs = true @@ -385,6 +394,8 @@ private func printStderr(_ message: String) { extension PackageToJS.PackageOptions { static func parse(from extractor: inout ArgumentExtractor) -> PackageToJS.PackageOptions { let outputPath = extractor.extractOption(named: "output").last + let configuration: String? = + (extractor.extractOption(named: "configuration") + extractor.extractSingleDashOption(named: "c")).last let packageName = extractor.extractOption(named: "package-name").last let explain = extractor.extractFlag(named: "explain") let useCDN = extractor.extractFlag(named: "use-cdn") @@ -392,6 +403,7 @@ extension PackageToJS.PackageOptions { let enableCodeCoverage = extractor.extractFlag(named: "enable-code-coverage") return PackageToJS.PackageOptions( outputPath: outputPath, + configuration: configuration, packageName: packageName, explain: explain != 0, verbose: verbose != 0, @@ -399,6 +411,18 @@ extension PackageToJS.PackageOptions { enableCodeCoverage: enableCodeCoverage != 0 ) } + + static func optionsHelp() -> String { + return """ + --output Path to the output directory (default: .build/plugins/PackageToJS/outputs/Package) + -c, --configuration The build configuration to use (values: debug, release; default: debug) + --package-name Name of the package (default: lowercased Package.swift name) + --use-cdn Whether to use CDN for dependency packages + --enable-code-coverage Whether to enable code coverage collection + --explain Whether to explain the build plan + --verbose Whether to print verbose output + """ + } } extension PackageToJS.BuildOptions { @@ -431,15 +455,10 @@ extension PackageToJS.BuildOptions { USAGE: swift package --swift-sdk [SwiftPM options] js [options] [subcommand] OPTIONS: - --product Product to build (default: executable target if there's only one) - --output Path to the output directory (default: .build/plugins/PackageToJS/outputs/Package) - --package-name Name of the package (default: lowercased Package.swift name) - --explain Whether to explain the build plan - --verbose Whether to print verbose output - --no-optimize Whether to disable wasm-opt optimization - --use-cdn Whether to use CDN for dependency packages - --enable-code-coverage Whether to enable code coverage collection - --debug-info-format The format of debug info to keep in the final wasm file (values: none, dwarf, name; default: none) + --product Product to build (default: executable target if there's only one) + --no-optimize Whether to disable wasm-opt optimization + --debug-info-format The format of debug info to keep in the final wasm file (values: none, dwarf, name; default: none) + \(PackageToJS.PackageOptions.optionsHelp()) SUBCOMMANDS: test Builds and runs tests @@ -449,7 +468,7 @@ extension PackageToJS.BuildOptions { # Build a specific product $ swift package --swift-sdk wasm32-unknown-wasi js --product Example # Build in release configuration - $ swift package --swift-sdk wasm32-unknown-wasi -c release plugin js + $ swift package --swift-sdk wasm32-unknown-wasi js -c release # Run tests $ swift package --swift-sdk wasm32-unknown-wasi js test @@ -492,15 +511,12 @@ extension PackageToJS.TestOptions { USAGE: swift package --swift-sdk [SwiftPM options] js test [options] OPTIONS: - --build-only Whether to build only - --prelude Path to the prelude script - --environment The environment to use for the tests (values: node, browser; default: node) - --inspect Whether to run tests in the browser with inspector enabled - --explain Whether to explain the build plan - --verbose Whether to print verbose output - --use-cdn Whether to use CDN for dependency packages - --enable-code-coverage Whether to enable code coverage collection - -Xnode Extra arguments to pass to Node.js + --build-only Whether to build only + --prelude Path to the prelude script + --environment The environment to use for the tests (values: node, browser; default: node) + --inspect Whether to run tests in the browser with inspector enabled + -Xnode Extra arguments to pass to Node.js + \(PackageToJS.PackageOptions.optionsHelp()) EXAMPLES: $ swift package --swift-sdk wasm32-unknown-wasi js test diff --git a/Plugins/PackageToJS/Tests/ExampleTests.swift b/Plugins/PackageToJS/Tests/ExampleTests.swift index 30487869..c51cbfa9 100644 --- a/Plugins/PackageToJS/Tests/ExampleTests.swift +++ b/Plugins/PackageToJS/Tests/ExampleTests.swift @@ -242,7 +242,7 @@ extension Trait where Self == ConditionTrait { @Test(.requireEmbeddedSwift) func embedded() throws { try withPackage(at: "Examples/Embedded") { packageDir, runSwift in try runSwift( - ["package", "--triple", "wasm32-unknown-none-wasm", "-c", "release", "js"], + ["package", "--triple", "wasm32-unknown-none-wasm", "js", "-c", "release"], [ "JAVASCRIPTKIT_EXPERIMENTAL_EMBEDDED_WASM": "true" ]