Happy to see this in motion! I wrote up a jira a while back for this: 
https://bugs.swift.org/browse/SR-859

+1 for the solution. I prefer the target-based system over source files.

> On Jul 7, 2016, at 5:26 AM, Ankit Agarwal via swift-evolution 
> <[email protected]> wrote:
> 
> Hi swift packagers,
> 
> I am proposing access control to package targets. 
> 
> Link: 
> https://github.com/aciidb0mb3r/swift-evolution/blob/swiftpm-module-access-control/proposals/xxxx-swiftpm-target-access-control.md
>  
> <https://github.com/aciidb0mb3r/swift-evolution/blob/swiftpm-module-access-control/proposals/xxxx-swiftpm-target-access-control.md>
> 
> Feedback appreciated!
> 
> SwiftPM Target Access Control
> 
> Proposal: SE-XXXX 
> <https://github.com/apple/swift-evolution/blob/master/proposals/xxxx-swiftpm-target-access-control.md>
> Author: Ankit Aggarwal <https://github.com/aciidb0mb3r>
> Status: In Discussion
> Review manager: TBD
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#introduction>Introduction
> 
> This proposal aims to address two issues:
> 
> Control over the targets exposed (and built) when a SwiftPM package is used 
> as a dependency.
> 
> Import (and build) selected targets of a dependency.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#motivation>Motivation
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#1-control-over-exposed-targets>1.
>  Control over exposed targets:
> 
> SwiftPM allows multiple targets (or modules) inside a package. Packages 
> usually contain sample usage or example targets which are useful during 
> development or testing of the package but are redundant when the package is 
> used as a dependency. This increases compile time for the user of the package.
> 
> As a concrete example: Vapor has a target called Development 
> <https://github.com/qutheory/vapor/tree/master/Sources/Development>.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#2-import-selected-targets>2.
>  Import selected targets:
> 
> Sometimes user of a package is only interested in few targets of a dependency 
> instead of all the targets. Currently there is no way to state this in 
> Package.swift and all the targets are implicitly built and exposed to the 
> user package.
> 
> For e.g.: I would like to use the targets libc, POSIX, Basic of SwiftPM but 
> don't want other targets to be built or exposed in my package.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#proposed-solution>Proposed
>  Solution
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#1-control-over-exposed-targets-1>1.
>  Control over exposed targets:
> 
> I propose that package authors be able mark the targets they don't want to be 
> exposed as private i.e. the privatetargets will be built when that package is 
> root package but not when the package is used as a dependency.
> 
> To mark a target as private I propose PackageDescription's Target gains a 
> isPrivate boolean property which defaults to false.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#2-import-selected-targets-1>2.
>  Import selected targets:
> 
> I propose that package user be able to specify the targets they want to 
> import into their package.
> 
> To specify the targets to be import I propose to add an optional string array 
> property targets in PackageDescription's Package.Dependency which defaults to 
> nil i.e. all targets.
> 
> Instead of an optional string array property an enum can also be used:
> 
> enum ImportedTargets {
>     case allTargets // Import all the targets, default value.
>     case targets([String]) // Import only these targets.
> }
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#detailed-design>Detailed
>  Design
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#1-control-over-exposed-targets-2>1.
>  Control over exposed targets:
> 
> Consider a package with following structure: 
> 
> ├── Package.swift
> └── Sources
>     ├── FooLibrary
>     │   └── Foo.swift
>     └── SampleCLI
>         └── main.swift
> The manifest with private target could look like:
> 
> import PackageDescription
> 
> let package = Package(
>    name: "FooLibrary",
>    targets: [
>        Target(name: "FooLibrary"),
>        Target(name: "SampleCLI", isPrivate: true),
>    ])
> When this package is used as a dependency only FooLibrary is built and is 
> importable.
> 
> Targets can have other targets as dependency inside a package. A private 
> target should only be a dependency to other private targets. For e.g. A 
> manifest like this should result in a build failure.
> 
> import PackageDescription
> 
> let package = Package(
>    name: "FooLibrary",
>    targets: [
>        Target(name: "FooCore", isPrivate: true),
>        Target(name: "FooLibrary", dependencies: ["FooCore"]), // Error 
> FooCore is private.
>        Target(name: "SampleCLI", dependencies: ["FooCore"], isPrivate: true), 
> // Not an error because SampleCLI is private.
>    ])
> Error: FooCore is a private target, it cannot be a dependency to the public 
> target FooLibrary.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#2-import-selected-targets-2>2.
>  Import selected targets:
> 
> Consider a dependency with following manifest file:
> 
> import PackageDescription
> 
> let package = Package(
>    name: "FooLibrary",
>    targets: [
>        Target(name: "Foo"),
>        Target(name: "Bar", dependencies: ["Foo"]),
>        Target(name: "Baz"),
>    ])
> To get only the Bar target from the above package, following manifest could 
> be written:
> 
> import PackageDescription
> 
> let package = Package(
>    name: "FooUser",
>    dependencies: [
>        .Package(
>            url: "../FooLibrary", 
>            majorVersion: 1, 
>            targets: ["Bar"])
>    ])
> Note: In this case since Bar depends on Foo, Foo will be also be implicitly 
> built and be available.
> 
> Any target mentioned in targets and not present in the package should result 
> in build failure.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#impact-on-existing-code>Impact
>  on Existing Code
> 
> There will be no impact on existing code as these features are additive.
> 
>  
> <https://github.com/aciidb0mb3r/swift-evolution/tree/swiftpm-module-access-control#alternatives-considered>Alternatives
>  Considered
> 
> None at this time.
> 
> -- 
> Ankit
> 
> 
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to