[swift-build-dev] Feature request: Scripting support for Swift

Daniel Dunbar daniel_dunbar at apple.com
Mon Feb 20 13:36:21 CST 2017

I have a crazy idea about how this could work by integrating with SwiftPM -- would love to see someone mock up a prototype...

1. Define a special syntax for describing a script's dependencies inline in the script source
2. Create a mode for the Swift package manager where it analyzes the input script, extracts the package dependencies, and creates a custom Swift package just for that script.
3. Identify the created Swift package by hash, and stash it somewhere in the user's home directory, so that it would be cached
4. Automatically build and run the package

The cool thing about this model is it would seamlessly integrate command line scripting and the Swift package ecosystem, and it would provide a seamless user experience that avoids needing to worry about building anything to get good script performance. As the package manager got smarter about being able to share build artifacts it would transparently get faster, but user's wouldn't need to worry about managing the dependencies.


#!/usr/bin/env swift run --script

// Uses: SuperCoolCommandLine: 1.x
// Uses: AreYouFeelingANSI: 1.3.x

import SuperCoolCommandLine
import AreYouFeelingANSI


 `swift` will already happily look for binaries like `swift-run` today (like git), so there is nothing blocking someone from hacking this up as a quick and dirty script to see how it works...

 - Daniel

> On Feb 18, 2017, at 11:26 AM, Maxim Veksler via swift-build-dev <swift-build-dev at swift.org> wrote:
> Hi,
> Ayaka Nonaka gave a talk[1] about basic scripting[2] support in Swift. 
> The gist of the idea is to use #!/usr/bin/env xcrun swift
> Therefor it seems the basic building blocks for allowing a swift file to "execute itself" are always laid out and proved to be applicable. 
> What's missing IMHO is a better support for dependencies, the suggested solutions in the talk are using the -F for including frameworks that were built using Carthage or CocoaPods. That's not idle because a script I think should be self contained, meaning that you can "just run it" and it works. 
> So, I'm wondering what if it was possible to include the dependencies inside the swift file itself? Probably using the same format as the Package.swift syntax. The the swift binary would "detect" that it's a self contained file, it could make this distinction because import PackageDescription is defined by the user.
> Then it would follow a 3 step process:
> 1. It should download and build the dependencies
> 2. then compile the code inside the file
> 3. and then run it. 
> Having everything happening behind the scenes, so the "script user" simply calls ./MyScript.swift or swift MyScript.swift and it "just works". 
> Wondering what the community thinks.
> [1] https://realm.io/news/swift-scripting/ <https://realm.io/news/swift-scripting/>
> [2] https://github.com/ayanonagon/talks/tree/master/2015-swiftsummit/2 <https://github.com/ayanonagon/talks/tree/master/2015-swiftsummit/2>_______________________________________________
> swift-build-dev mailing list
> swift-build-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-build-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-build-dev/attachments/20170220/8ae3334d/attachment.html>

More information about the swift-build-dev mailing list