Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

swift CryptoKit on Ubuntu

I am trying to compile a small swift program, "main.swift" to an executable on Ubuntu 18.08. I use the Swift Package Manager to manage my dependencies. In this very simple case I only have one dependency, namely this open-source CryptoKit. I have one swift file which just tries to import CryptoKit.

import Foundation
import CryptoKit
print("phew")

My Package.swift file looks like this:

// swift-tools-version:5.2

import PackageDescription

let package = Package(
    name: "decryp",
    dependencies: [
      .package(url: "https://github.com/apple/swift-crypto.git", .upToNextMajor(from: "1.0.1"))
    ],
    targets: [
        .target(
            name: "decryp",
            dependencies: ["swift-crypto"]
        ),
        .testTarget(
            name: "decrypTests",
            dependencies: ["decryp"]),
    ]
)

When I try to build the executable with swift build it fetches the repository, but then gives an error with a product not found. stdout from swift build:

Fetching https://github.com/apple/swift-crypto.git
Cloning https://github.com/apple/swift-crypto.git
Resolving https://github.com/apple/swift-crypto.git at 1.0.2
'decryp' /home/kah/decryp: error: product 'swift-crypto' not found. It is required by target 'decryp'.
warning: dependency 'swift-crypto' is not used by any target

Maybe I am missing something obvious? I am still a beginner in the swift world.

like image 988
Whir Avatar asked Oct 15 '22 01:10

Whir


1 Answers

Looking at swift-crypto Package.swift gave a clue. The swift-crypto library name is "Crypto", so I tried with that instead which gave an error:

 error: dependency 'Crypto' in target 'decryp' requires explicit declaration; 
 reference the package in the target dependency with '.product(name: "Crypto", 
 package: "swift-crypto")'

But that says what to do, so when I changed my Package.swift to the following and imported "Crypto" instead of "CryptoKit" everything works!

// swift-tools-version:5.2

import PackageDescription

let package = Package(
    name: "decryp",
    dependencies: [
      .package(url: "https://github.com/apple/swift-crypto.git", .upToNextMajor(from: "1.0.1"))
    ],
    targets: [
        .target(
            name: "decryp",
            dependencies: [
              .product(name: "Crypto", package: "swift-crypto")
]
        ),
        .testTarget(
            name: "decrypTests",
            dependencies: ["decryp"]),
    ]
)

Now I can send an encrypted message from my phone to a server and then decrypt it locally on my ubuntu laptop, thanks to the swift-crypto team!

like image 186
Whir Avatar answered Oct 20 '22 18:10

Whir