I’m planning on adding options to the swift build command to allow building specific targets or products in the package and its dependencies. And allow swift run to execute arbitrary products in all the package’s dependencies. I’d like to get feedback on those before going forward or not.
The swift build command builds all the package targets but doesn’t allow building a specific target or a dependency’s product. This can be useful during development when concentrating on a single target.
The swift run command searches for an executable to run in the package dependency graph but won’t find it unless it is declared as a target dependency, which is rarely the case. For example, a package using the code generation capabilities of the executable product in the Sourcery <https://github.com/krzysztofzablocki/Sourcery> package can’t run it with swift run sourcery unless the executable is added as a product dependency, linking the executable's module, which doesn't make much sense.
To solve both issues above, I was planning on adding 3 new options to the swift build tool:
--target Specify target to build
--product Specify product to build from the package or its dependencies
--package Specify the package to build
Here are different examples using those options:
# Builds the Basic target from the root package.
$ swift build —target Basic
# Searches for a product named SwiftyJSON in the root package and its dependencies and builds it.
$ swift build —product SwiftyJSON
# Builds all products of the Sourcery package dependency.
$ swift build —package Sourcery
# Builds the sourcery product from the Sourcery package.
$ swift build —package Sourcery —product sourcery
To mirror the behavior of products in the package definition format in SE-0146 <https://github.com/apple/swift-evolution/blob/master/proposals/0146-package-manager-product-definitions.md>:
The --target option can not reference targets in dependent packages because they are considered as implementation details.
The --product option is generally enough to unambiguously reference a product because product names are expected to be unique. If it is not the case, the --package option is available for disambiguation.
To allow the swift run command to reference products which are not depended on, the swift build --package option will also support referencing products which are not depended on. Indeed, as the run command implicitly runs the build command, it makes more sense to give both commands to same features.
Thanks in advance for your feedback,