Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Getting Resourceful With Swift Package Manager - Swifters Budapest, Online, December 2020

Getting Resourceful With Swift Package Manager - Swifters Budapest, Online, December 2020

A lightning talk from Swifters Budapest about SPM 5.3's new ability to handle resources.

Kittstagram app: https://github.com/designatednerd/Kittstagram
HankBytes Library: https://github.com/designatednerd/HankBytes
Video: [Coming soon!]

Ellen Shapiro
PRO

December 15, 2020
Tweet

More Decks by Ellen Shapiro

Other Decks in Technology

Transcript

  1. GETTING RESOURCEFUL
    WITH SWIFT PACKAGE MANAGER
    SWIFTERS BUDAPEST | THE INTERNETS | DECEMBER 2020
    ELLEN SHAPIRO | @DESIGNATEDNERD | APOLLOGRAPHQL.COM

    View Slide

  2. View Slide

  3. View Slide

  4. View Slide

  5. BUT I CAN'T USE SPM WITH
    XIBS, COREDATA MODELS, ASSET CATALOGS, ETC.

    View Slide

  6. SE-271
    PACKAGE MANAGER RESOURCES
    HTTPS://GITHUB.COM/APPLE/SWIFT-EVOLUTION/BLOB/MAIN/PROPOSALS/0271-PACKAGE-MANAGER-RESOURCES.MD

    View Slide

  7. View Slide

  8. A BRIEF
    !
    DETOUR

    View Slide

  9. HANK

    View Slide

  10. GEORGE MICHAEL

    View Slide

  11. HANK

    View Slide

  12. KITTSTAGRAM APP
    GITHUB.COM/DESIGNATEDNERD/KITTSTAGRAM

    View Slide

  13. View Slide

  14. HANKBYTES LIBRARY
    GITHUB.COM/DESIGNATEDNERD/HANKBYTES

    View Slide

  15. // swift-tools-version:5.3

    View Slide

  16. targets: [
    .target(
    name: "HankBytes",
    dependencies: [],
    resources: [
    .process("Resources")
    ]
    ),
    .testTarget(
    name: "HankBytesTests",
    dependencies: ["HankBytes"]),
    ]

    View Slide

  17. targets: [
    .target(
    name: "HankBytes",
    dependencies: [],
    resources: [
    .process("Resources")
    ]
    ),
    .testTarget(
    name: "HankBytesTests",
    dependencies: ["HankBytes"]),
    ]

    View Slide

  18. .process

    View Slide

  19. .process
    PROCESS THIS BASED ON PER-PLATFORM
    RULES AND OPTIMIZATIONS

    View Slide

  20. .copy

    View Slide

  21. .copy
    COPY THIS EXACTLY AS IT IS
    (INCLUDING DIRECTORY STRUCTURE)

    View Slide

  22. RESOURCES ARE SCOPED
    PER-TARGET

    View Slide

  23. View Slide

  24. Bundle.module

    View Slide

  25. Bundle.module
    THIS IS THE BUNDLE FOR THE CURRENT
    MODULE CREATED BY THE SPM TARGET

    View Slide

  26. WITHIN YOUR LIBRARY
    Bundle.module.url(forResource: self.fileName,
    withExtension: self.fileExtension)
    UIImage(named: self.fileName,
    in: .module,
    compatibleWith: nil)

    View Slide

  27. WITHIN YOUR LIBRARY
    Bundle.module.url(forResource: self.fileName,
    withExtension: self.fileExtension)
    UIImage(named: self.fileName,
    in: .module,
    compatibleWith: nil)

    View Slide

  28. PUBLIC API YOUR APP CAN CONSUME
    public var image: UIImage? {
    if let image = UIImage(named: self.fileName,
    in: .module,
    compatibleWith: nil) {
    return image
    } else {
    guard let path = self.photoURL?.path else {
    return nil
    }
    return UIImage(contentsOfFile: path)
    }
    }

    View Slide

  29. PUBLIC API YOUR APP CAN CONSUME
    public var image: UIImage? {
    if let image = UIImage(named: self.fileName,
    in: .module,
    compatibleWith: nil) {
    return image
    } else {
    guard let path = self.photoURL?.path else {
    return nil
    }
    return UIImage(contentsOfFile: path)
    }
    }

    View Slide

  30. View Slide

  31. LOCALIZATION

    View Slide

  32. SE-278
    PACKAGE MANAGER LOCALIZED RESOURCES
    HTTPS://GITHUB.COM/APPLE/SWIFT-EVOLUTION/BLOB/MAIN/PROPOSALS/0278-PACKAGE-MANAGER-LOCALIZED-RESOURCES.MD

    View Slide

  33. View Slide

  34. let package = Package(
    name: "HankBytes",
    defaultLocalization: "en",
    platforms: [
    .iOS(.v14)
    ],
    products: [
    .library(
    name: "HankBytes",
    targets: ["HankBytes"]),
    ],
    dependencies: [],
    targets: [...

    View Slide

  35. let package = Package(
    name: "HankBytes",
    defaultLocalization: "en",
    platforms: [
    .iOS(.v14)
    ],
    products: [
    .library(
    name: "HankBytes",
    targets: ["HankBytes"]),
    ],
    dependencies: [],
    targets: [...

    View Slide

  36. BASE.LPROJ

    View Slide

  37. BASE.LPROJ

    Storyboards and Nibs

    View Slide

  38. BASE.LPROJ

    Storyboards and Nibs
    "
    .strings files

    View Slide

  39. USE ISO CODES
    English: en.lproj

    View Slide

  40. USE ISO CODES
    English: en.lproj
    !
    English: en_GB.lproj

    View Slide

  41. USE ISO CODES
    English: en.lproj
    !
    English: en_GB.lproj
    "
    English: en_US.lproj

    View Slide

  42. View Slide

  43. View Slide

  44. "Avoiding unintentionally copying
    files not intended to be localized
    variants into the product"

    View Slide

  45. DON'T COPY RESOURCES FOR
    UNSUPPORTED LANGUAGES

    View Slide

  46. WHAT CAN'T YOU INCLUDE
    USING RESOURCES?

    View Slide

  47. THINGS YOU DON'T WANT
    INCLUDED IN YOUR LIBRARY

    View Slide

  48. BUILD SCRIPTS
    IN BASH OR OTHER LANGUAGES

    View Slide

  49. View Slide

  50. !

    View Slide

  51. OBLIGATORY SUMMARY SLIDE

    View Slide

  52. OBLIGATORY SUMMARY SLIDE
    > SPM lets you include resources used in your code in a
    target like images, core data models, xibs, etc.

    View Slide

  53. OBLIGATORY SUMMARY SLIDE
    > SPM lets you include resources used in your code in a
    target like images, core data models, xibs, etc.
    > Resources are scoped to a particular target

    View Slide

  54. OBLIGATORY SUMMARY SLIDE
    > SPM lets you include resources used in your code in a
    target like images, core data models, xibs, etc.
    > Resources are scoped to a particular target
    > Bundle.module auto-generated when targets
    declare resources

    View Slide

  55. OBLIGATORY SUMMARY SLIDE
    > SPM lets you include resources used in your code in a
    target like images, core data models, xibs, etc.
    > Resources are scoped to a particular target
    > Bundle.module auto-generated when targets
    declare resources
    > Resources can be localized!

    View Slide

  56. OBLIGATORY SUMMARY SLIDE
    > SPM lets you include resources used in your code in a
    target like images, core data models, xibs, etc.
    > Resources are scoped to a particular target
    > Bundle.module auto-generated when targets
    declare resources
    > Resources can be localized!
    > It does not let you include build helpers

    View Slide

  57. THANK YOU!

    View Slide

  58. APPLE LINKS
    > https://developer.apple.com/documentation/
    swift_packages/
    bundling_resources_with_a_swift_package
    > https://developer.apple.com/documentation/
    swift_packages/
    localizing_package_resources

    View Slide

  59. NOT-APPLE LINKS
    > https://useyourloaf.com/blog/add-
    resources-to-swift-packages/
    > https://medium.com/better-programming/how-
    to-add-resources-in-swift-package-manager-
    c437d44ec593

    View Slide