Guild icon
swift-developers-japan
main / swiftpm
Avatar
norio_nomura 4/26/2017 1:00 AM
SwiftPMでクロスコンパイルが出来るようになったぽい。 https://github.com/apple/swift-package-manager/pull/1098
General This adds experimental support for cross compilation or more precisely configurable destinations for binaries to SwiftPM. The basic idea is that you hand a JSON file in the format described...
Avatar
omochimetaru 4/26/2017 1:10 AM
おー iPhoneSDKでビルドする話も書いてありますね
1:11 AM
iphoneアプリもこれでできるようになるのが楽しみ
1:11 AM
>For example compiling an iPhone binary from your Mac will use…
Avatar
今って、xcodeproj生成するときにOSバージョンの指定とか出来たっけ
1:16 AM
毎回mac以外空で生成されるから後から埋めてる
Avatar
omochimetaru 4/26/2017 1:17 AM
そんなん無かったと思う
1:17 AM
iOSに切り替えるだけじゃシミュレーターテストとかもできなくて
Avatar
その辺も指定できるようになると嬉しい
Avatar
omochimetaru 4/26/2017 1:19 AM
xcode特有のパラメータはどうやって取り回す設計を想定しているんだろうなあ
Avatar
norio_nomura 4/27/2017 5:13 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
5:14 AM
Package.pinPackage.resolved に名前が変わって、ビルド時に自動更新されるみたいなイメージかな。
Avatar
The Package Manager in Swift 4 includes the redesigned Package.swift manifest API. The new API is easier to use and follows the design guidelines. The target inference rules in Swift 3 Package Manager were a common source of confusion. We revised these rules and removed most of the inference, favoring the practice of explicitly specifying package structure in the manifest.
Avatar
Package.swift の、初見でも迷いようのないシンプルな感じが好きだったんですが、結構複雑になりましたね・・・
Avatar
ですねー...正直覚えきれない感
Avatar
まあ自動生成するんで丸暗記はしないですが、初見で理解すべきことが増えちゃいましたね〜。
7:20 AM
products, dependencies, targets はデフォルト引数付けられなかったのかなぁ・・・。
Avatar
凝ったことしないなら古いManifest使えばいいのでは
Avatar
なるほど、新旧共存するんですね 👀
Avatar
え、移行期間だけとかじゃないんです?
Avatar
Swiftのバージョン毎にPackage.swiftを置けます。
10:31 AM
SourceKitten - An adorable little framework and command line tool for interacting with SourceKit.
SourceKitten - An adorable little framework and command line tool for interacting with SourceKit.
10:35 AM
Package@swift-4.swiftってのがあるとswift 4.0のtoolchainはそっちを使ってくれます。
Avatar
ふむふむ
Avatar
この共存の形だと、Swift 3のまま動きのないパッケージでも(Swift 3.2のおかげで)問題なく使い続けられるという認識
Avatar
うーん、 swift package init で生成されるのが新しい方なんですよね?それだとわざわざ古いマニフェスト使う理由もない気がします。が、自動生成されるものが一見してごちゃっとするのが嫌だなぁと。
Avatar
swiftLanguageVersionsPackage.swiftに書くとSwift 3.0.2でエラーになるのですが、Package.swiftにはswiftLanguageVersionsを書かずPackage@swift-4.swiftを使うことで、Swift 3.0.2からSwift 4までビルド可能にできます。 (edited)
11:10 AM
それだとわざわざ古いマニフェスト使う理由もない気がします。
ですね。
(edited)
11:14 AM
古いマニフェストは、マニフェスト内に明記されていない暗黙のルールがあって、その暗黙のルールが途中で変わったりしたので、あまり良いイメージがないです。
Avatar
とりあえず、既存のパッケージに新しいマニフェストを追加するモチベーションは、個人的には主に2つ
  • dependencyをバージョンタグではなくブランチで取得できる。
  • Clangターゲットをスタティックリンクできる。
(edited)
12:14 PM
-Xswiftc -static-stdlibを使うとSwift Standard Libraryをスタティックリンクできるので、実行時にlibswift*.dylibが不要になる。 (edited)
12:16 PM
しかし古いマニフェストだと、Clangターゲットは必ずダイナミックリンクライブラリになってしまうので、実行ファイルを一つにできなかった。 (edited)
Avatar
omochimetaru 6/27/2017 1:33 PM
え、まじ、?
1:33 PM
!?
1:33 PM
Swift/emscriptenが
1:34 PM
stdlibのdylibなせいで出来てないんです
1:34 PM
staticリンクできるようになったら一歩前進
1:36 PM
>Also, I think Swift 4 SPM defaults to building static libraries now.
1:36 PM
言及してるひといた
1:36 PM
Hi team, playing around with Emscripten in earnest for the first time, not my usual area of work so apologies if this is clearly never going to work. What I'd like to do is compile a simple Swift p...
Avatar
emscriptenちょっと試してみたけど「クロスコンパイルターゲットをどの様に用意するか?」な問題に移ってる様に見える。 https://gist.github.com/norio-nomura/0de81d639484e08fcd7124576d251713 (edited)
11:54 PM
チャンネル違いか
Avatar
defaultでstatic linkの件、この辺見るとよさそう https://github.com/apple/swift-package-manager/pull/1246#issuecomment-311460860
-- rdar://problem/32618121 [SR-648]: swift package manager should produce statically linked binaries
12:15 AM
macOSでだけデフォルトオンにするのは反対、という流れで、ただ--static-swift-stdlibというオプションは少なくとも増えそう
👍 2
Avatar
omochimetaru 6/28/2017 1:28 AM
@ikesyo あれ、そもそもdylibベースなのに深い理由でもあるのかと思っていたけどそうでもないんですかね
Avatar
昨日Xcode 9 beta 2で新しいPackage.swiftに慣れようといじってたのですが 古い方みたいに swift package generate-xcodeproj ではライブラリを参照まではしてくれなかったりしますか?
4:56 AM
Package.swift // swift-tools-version:4.0 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "Sandbox", products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. .library( name: "Sandbox", targets: ["Sandbox"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. .package(url: "https://github.com/Alamofire/Alamofire.git", .branch("swift4")) ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "Sandbox", dependencies: []), .testTarget( name: "SandboxTests", dependencies: ["Sandbox"]), ] )
Avatar
下のtargetにもdependencies を指定すれば解決しそうです
4:56 AM
target名で (edited)
Avatar
なるほど、ありがとうございます! 試して見ます
Avatar
今の記述だと、そのtargetをimportしたコード書いただけで、Xcode関係なくswift build自体失敗しません?
Avatar
ビルドは特にエラー吐いてないみたいで swift build ⏎ Compile Swift Module 'Alamofire' (17 sources) Compile Swift Module 'Sandbox' (1 sources)
5:00 AM
importしたコード書いただけ
あ、という意味だと失敗します
5:05 AM
@mono ありがとうございます、ビルド成功しました 🙇
😀 1
Avatar
omochimetaru 7/5/2017 5:32 AM
SPMでビルド済みのC static libraryをswiftとリンクする時に ソースツリーに配置したstatic libraryを相対パスで指定することってできますか? http://qiita.com/shingt/items/08c726f968dd8508b1e2 Qiita Swift Package Manager経由でSwiftからCのライブラリを利用する - Qiita # 概要 Swiftがオープンソース化されると同時に[Swift Package Manager](https://github.com/apple/swift-package-manager)(以下SPMと略記)も公開されました。... この記事の例だとシステムにインストールされた libhiredis をリンクしているようなんですが これをリポジトリローカルでやりたい https://clang.llvm.org/docs/Modules.html#link-declaration module map の link 命令は -l オプションになるっぽいのです あ、 $ swift build に -Xlinker があるな。
5:32 AM
↑これうまくいきました。 $ swift build -Xlinker -LSources/PbClib/lib てなかんじで。
5:33 AM
SPMのなかにシステムのlibcをラップするターゲットがあって
5:33 AM
swift-package-manager - The Package Manager for the Swift Programming Language
5:33 AM
それの構成を真似してmodule.modulemapを作りました。
Avatar
@moaible 僕もハマったのですが、 https://github.com/apple/swift-evolution/blob/master/proposals/0158-package-manager-manifest-api-redesign.md#example-manifests を見て、解決しました。初見殺しですよね、特に3時代に使っていた場合なかなか気づけないです( ´・‿・`)
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
@mono おお...情報ありがとうございますproposalの方にあるんですね、結構探したと思ったんですが気づきませんでしたorz READMEにリンクでもあるとハマる人が減りそうな気もしました(正式リリースしてから整備かな?) と思ったらここに詳細ありました 😇 https://github.com/apple/swift-package-manager/blob/swift-4.0-branch/Documentation/PackageDescriptionV4.md (edited)
swift-package-manager - The Package Manager for the Swift Programming Language
👍 1
Avatar
omochimetaru 7/6/2017 3:22 AM
llbuildの動画を見た
3:23 AM
SwiftPMはここらへんのコードで
3:23 AM
SPMのグラフ構造をllbuildへの入力に変換して
3:24 AM
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
SwiftPMはllbuildを直接叩いてるけど、Xcode 9のnew build systemだと、中間にxcbuildというXPCのプロセスがいて、そこ経由でllbuildを使ってるそうです
Avatar
そのxcbuildというのはfacebook製のxcbuildとは別物ですよね?
12:54 PM
名前被っちゃったのか
Avatar
別物です、どっちが先なのかは誰も分からなさそうw
Avatar
omochimetaru 7/10/2017 1:17 PM
なんでプロセス分けてるんだろう IDEとしてのxcodeがよくバグるから、クラッシュ巻き込まれないようにしたのかな
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 7/12/2017 1:35 AM
Avatar
どんどん Package の引数が増えると、順番わからなくなってしまう。 let package = Package() package.name = "FooBar" package.products = [...] みたいに書いていった方が楽かもしれん。
Avatar
omochimetaru 7/12/2017 1:37 AM
そうですね
Avatar
引数がタプルモデルを止めたんだったら引数の順番変えられるようにしてもいいかもですね。せっかくラベルあるんだし。
Avatar
omochimetaru 7/12/2017 1:38 AM
なんかこれだけじゃ仕様としていろいろ足りない気がするけど
1:38 AM
C++も clang module system を前提にするのかな
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
omochimetaru 7/12/2017 1:40 AM
@koher は何が気になってcpp buildのリンクをはったんですか?
Avatar
気になったというか、レビュー入りしたからです。
1:41 AM
@omochimetaru が気になりそうな話題だと思って。 (edited)
Avatar
omochimetaru 7/12/2017 1:41 AM
ほんとうだ July11...14
1:41 AM
Once we get the build settings feature, we will deprecate these properties.
1:42 AM
これって、ビルドセッティング機能を後に足したときに、この提案で足してる cStandard を削除する
1:42 AM
って意味なんですかね
Avatar
"build settings feature" って何だろう?
Avatar
omochimetaru 7/12/2017 1:42 AM
いま全く0機能なのを0.2ぐらいとりあえずつなぎで入れる、って感じがする
1:42 AM
@rintaro xcodeの build settings とかでやるような、いろんなビルドオプションを設定する機能のことかと想像しました
👍 1
Avatar
norio_nomura 7/12/2017 1:46 AM
[swift-evolution-announce] Swift 4 Package Manager Roadmap https://lists.swift.org/pipermail/swift-evolution-announce/2017-January/000307.html
1:47 AM
^に – Support Build Settings ってのも書かれてる。
Avatar
omochimetaru 7/12/2017 1:48 AM
– Support Build Settings The package manager has no way to provide specific settings, such as compiler flags, for building the targets in a package. Some settings are critical for production code, such as the "deployment target" (the minimum OS version that the built code will run on). We need to provide a way to set at least the most important settings which users will need control over.
Avatar
norio_nomura 7/12/2017 1:48 AM
いま全く0機能なのを0.2ぐらいとりあえずつなぎで入れる、って感じがする
ですね。
😑 1
Avatar
Avatar
norio_nomura 7/12/2017 1:49 AM
どんどん Package の引数が増えると、順番わからなくなってしまう。
PackageDescription.PackageCodable対応にして、Package.swiftへエンコードするEncoderを作る…
(edited)
Avatar
omochimetaru 7/12/2017 1:50 AM
それだと環境でパラメータを分岐したりできない
Avatar
norio_nomura 7/12/2017 1:51 AM
PlaygroundでPackageDescriptionをインポートできる様にして、雛形を作る的なイメージ。
Avatar
omochimetaru 7/12/2017 1:52 AM
あ〜 , jsonじゃなくて、初期状態用の .swift を吐くんですね。
1:52 AM
そこから編集開始すると
Avatar
norio_nomura 7/12/2017 1:54 AM
ちょっとSwiftPMのSlackへ妄想を垂れ流してくるかな。
😃 1
1:59 AM
書いて来た 🙂
Avatar
omochimetaru 7/12/2017 2:00 AM
Hi, We have an unofficial slack team to aid the development of Swift Package Manager. All the major discussion happens on the mailing list but it is useful to have a quick communication channel to discuss something small or to bounce off some random ideas. You can get an invite to join the slack team by entering your email id here: https://swift-package-manager.herokuapp.com/ Team ID: http://swiftpm.slack.com More info on slack: https://slack.com -- Ankit
2:00 AM
ここですか?
Avatar
norio_nomura 7/12/2017 2:00 AM
そそ
Avatar
norio_nomura 7/12/2017 5:43 AM
とりあえず「PlaygroundでPackageDescriptionをインポートできるといいね!」ってことで要望を出しておいた。 http://www.openradar.me/radar?id=5057232672653312
Avatar
これ毎回ググりながら書いてたんですけど他の人はどうしてるんだろうと思ってました。
Avatar
ググりながら書いてますね
9:53 AM
swift buildしたらとりあえずコンパイルエラー出るから直感でやってたりもする
Avatar
SPMのライブラリにCのモジュールが入ってるのですが、 非SPMでの利用のためgenerate-xcodeprojで作ったxcodeprojをそのままリポジトリに入れました。 carthageでframeworkを作るとCモジュールのフレームワークにヘッダやmodulemapが入っておらず、 読み込めないものができていました。
12:59 PM
更にxcodeprojの設定を
  • Build Settings -> Defines ModuleをYES
  • Build Settings -> Module Map Fileにパス記述
  • Build Phases -> Headersを追加
でそれらが含まれた状態のものまでは作れたのですが、 出力されたフレームワークのmodulemapは元のものそのままになっており、 正常に読み込むには更にmoduleframework moduleに書き換える必要があるようです。
12:59 PM
Frameworkの中身まで書き換えるのはユーザーフレンドリーでないし、 xcodeprojの再生成もたびたびするのでうまいxcodeprojを作ってくれるとありがたいのですが何か方法はないでしょうか。
1:00 PM
今のところのブランチ https://github.com/t-ae/xorswift/tree/xcproj
xorswift - Xorshift pseudorandom number generator library for Swift.
Avatar
omochimetaru 7/21/2017 1:12 PM
それって、SPMとしてビルドするときは、Cモジュールの部分はFrameworkにはなってないって事?
1:12 PM
Swiftモジュール側からはmodulemap定義にもとづいてimportできるけど
Avatar
そこがよくわかんないんですよね
1:13 PM
xcodeprojのProductsにはFrameworkがでてるんですが
1:13 PM
あ、忘れてましたけど
1:14 PM
generate-xcodeprojで作ったらHeader search pathが勝手に追加されてます
Avatar
omochimetaru 7/21/2017 1:14 PM
SPM的にはCターゲットは別にFrameworkじゃないんじゃないかなあ
1:14 PM
SPMの下回りはllbuildで
1:14 PM
llbuildはllvmファミリだから、modulemapのシステムはあるけど
Avatar
上で書いた欠けてるFrameworkもsearch path追加したら読み込めました
1:15 PM
swift buildだとdylibができますしね
Avatar
omochimetaru 7/21/2017 1:16 PM
これビルドするにはどんなコマンド打てばいいの
Avatar
swift buildでいけるはず
Avatar
omochimetaru 7/21/2017 1:16 PM
ああ、packageつけないのか。
1:16 PM
まちがえてた
1:17 PM
cleanだとつくし微妙にややこしいですね
Avatar
omochimetaru 7/21/2017 1:17 PM
$ swift build -v
1:18 PM
ローレベルで叩いてるコマンドがダンプされる
Avatar
そっちはdylibができますよね?
Avatar
omochimetaru 7/21/2017 1:19 PM
だね
1:19 PM
libCxorswift.dylib
1:19 PM
をつくって
Avatar
carthage対応するには結局xcodeprojをおいてFrameworkをちゃんと作れる状態にする必要があるようなので
Avatar
omochimetaru 7/21/2017 1:20 PM
swift側では、 Cxorswift/includeにパス通して
1:20 PM
Cxcorsiwft/include/module.mapを読み込ませてるね
Avatar
そうなってますね。
Avatar
omochimetaru 7/21/2017 1:20 PM
だからやっぱSPMレベルではCバイナリ+ヘッダ+modulemapで
1:21 PM
swiftとつなぎこんでるから・・・
Avatar
xcodeだとtouch frameworkがあるんで別の方法になってますね
Avatar
omochimetaru 7/21/2017 1:22 PM
are?
1:22 PM
generate-xcodeprojして開いてビルドしたら
1:22 PM
ビルドはできたよ。
Avatar
それはできます。
Avatar
omochimetaru 7/21/2017 1:23 PM
Carthage対応がだめってことか。
Avatar
その中で使う分には問題ないんですが carthageとかで外で使おうとするとheader search path追加なりなんなりが必要になってしまう
Avatar
omochimetaru 7/21/2017 1:24 PM
carthageの問題なのでは
Avatar
iOSで使うんじゃなければCarthage対応いらないんじゃない?
Avatar
omochimetaru 7/21/2017 1:24 PM
自分だったらめんどくさくなってCarthage用のxcodeprojは完全に手動で別途保守しそう
1:24 PM
ディレクトリ構造的に共存できないとか?
Avatar
generate-xcodeprojした直後にビルドできるframeworkの時点でHeaders, Modulesが欠けてますからねぇ
1:25 PM
さっき貼ったブランチは設定書き換え済みでHeaders, Modulesが生成されるところまでいってます。
1:27 PM
設定書き換えるのがめんどくさいのはともかくcarthage用のmodulemapをおいておいてそれを指定すればなんとかなりそうな気がしてきました。
Avatar
omochimetaru 7/21/2017 1:28 PM
generate-xcodeprojはべき等に保ちたくない?
Avatar
設定周りも--xcconfig-overridesオプションつかえばいけるのかな
1:28 PM
--xcconfig-overridesで設定はいじれるらしいです
Avatar
omochimetaru 7/21/2017 1:28 PM
--xcconfig-overrides Path to xcconfig file
1:28 PM
おお!
1:28 PM
これはよさそう
Avatar
carthageのほう掘ってて知りました
Avatar
omochimetaru 7/21/2017 1:28 PM
xcconfigファイルをおいておいて、それを指定して生成するようにして
1:28 PM
生成コマンドはシェルスクリプトおいておけば
1:28 PM
べき等にできそうだ
Avatar
numswで議論してたのもこれで行けそうですよね
1:29 PM
ビルドスクリプトとかまでかけるかは確かめてないですが
Avatar
omochimetaru 7/21/2017 1:30 PM
あーxcconfigにはそれは書けない気もする
Avatar
やっぱりそんな気しますよね
1:30 PM
Build phasesが書けないならヘッダコピーが書けないのでだめそうだ
1:33 PM
出力してみましたがそれに当たるものはなさそうですね。
Avatar
omochimetaru 7/21/2017 1:33 PM
出力とは?
Avatar
xcodebuild -scheme "schemeName" -showBuildSettings >> mynew.xcconfig
1:33 PM
全部出てるか知らないですが
Avatar
omochimetaru 7/21/2017 1:34 PM
あー既存からダンプできるんだ
Avatar
一回生成してxcodeでいじって次生成するときは同じのをつかうみたいなのは簡単にできそうですね
Avatar
norio_nomura 7/22/2017 4:24 AM
xcodeprojの再生成もたびたびするのでうまいxcodeprojを作ってくれるとありがたいのですが何か方法はないでしょうか。 Cのモジュールを含む場合、再生成は全くお勧めできないかな。 (edited)
Avatar
norio_nomura 7/22/2017 6:08 AM
Xcodeの場合CとSwiftを同じターゲットに含められるので、一つのターゲットにするべき。
Avatar
xcprojは自前で作って持っておくってことですね
6:11 AM
carthageのほうでswiftpm対応のためxcodeprojを勝手に生成するみたいなプルリクが出てるんですがこっちのほうでは問題になりそうな
6:15 AM
問題としては、swiftpmでCモジュールへのdependenciesを持っているものすべてについて carthage対応しようとしたときに同じ対応が必要になることなんですが (edited)
Avatar
そもそもの疑問として、生成したxcodeprojが欠けたフレームワークを作って それをHeader Search Pathで補っている現状が正しいのかというのもあります。
Avatar
norio_nomura 7/22/2017 7:44 AM
一つのターゲットへの変更はこんな感じ。 https://github.com/t-ae/xorswift/compare/xcproj...norio-nomura:single-target-xcodeproj
xorswift - Xorshift pseudorandom number generator library for Swift.
7:50 AM
Sources/Cxorswift/include/Cxorswift.h を追加することで Sources/Cxorswift/include/module.modulemap を削除したりもしてる。
Avatar
そこ自動生成したxcodeprojだと絶対パス入りのmodulemapができちゃうんですよね
Avatar
norio_nomura 7/22/2017 7:52 AM
module.modulemap は使わない様に変えました。
Avatar
生成物も一つのフレームワークになって良いですね。 なんでSPMがこれをしてくれないのか……
Avatar
norio_nomura 7/22/2017 7:55 AM
xorswift.h はフレームワークのXorswift.hとかぶるので、xorshift.h xorshift.cpp へ名前を変えました。
7:56 AM
SwiftPMのXcode project生成は、ターゲットとかもSwiftPMの依存関係を再現することにこだわってるみたいですね。
7:58 AM
XcodeのClangターゲットは module.modulemap を自動で生成する機能を持ってるので、SwiftPMもそれを活かす様にしてくれれば良いのですが、活かしてくれず。
Avatar
単純に日が浅い+Cでの利用者がいないせいかもですね。 検索してもシステムモジュールの話ばっかりですし。
8:05 AM
先にCで書いたので速度が気になったのですが当分は全部swiftにしとくとかが楽な気がしてきました。
Avatar
ループアンローリングする前に測ったらswiftだと二倍近くかかってたのにいまの実装だと40%増くらいに収まっている……
8:14 AM
とりあえず純swiftにしておこうと思います。ありがとうございました。
Avatar
@t.ae Swiftの方が遅い理由ってどのあたりなんだろう?
Avatar
ループのみにしたらswiftとcで同程度でした。 xor, shiftの部分だと思います。 ループアンローリングでの性能悪化が軽減されてるのはよくわかんないですね。
Avatar
SwiftPMによって生成されたxcodeprojにSWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGEと設定されているのが疑問に思いAnkitさんに聞いてみたら、swift package generate-xcodeprojswift buildによるビルドをXcodeで再現するために存在するためらしい。
11:39 AM
汎用的なxcodeprojを作るのは目的に含まれていないため現在の挙動になっている。
Avatar
なるほど
Avatar
汎用的なxcodeprojを作るコマンドを追加してしまうべきだな。
Avatar
↓って情報が古いままだったりします? https://swift.org/package-manager/#example-usage
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
3の書き方(4でも動く)ぽいですね
Avatar
SwiftPM関連のProposalいっぱいあるんですが、Swift4時点の使い方の情報でまとまったものってありますか?swift-package-managerリポジトリを見ればいいんでしょうか?
9:40 AM
お、そうなんですね。
9:40 AM
9:40 AM
これとか?
Avatar
ソース見るのが手っ取り早かったです( ´・‿・`)
😅 1
Avatar
それですね
Avatar
お、ありがとうございます。
Avatar
Proposal追っても、その時点から微妙に変更あってそのままでは動かなかったり( ´・‿・`)
Avatar
そういえば、 SwiftPM じゃないですが、新しい Range 関連で UnboundRange が Proposal のどこにもない(ようだ)という話を @rintaro さんに聞きました。
9:43 AM
とりあえず↑のドキュメント見てやってみます。
Avatar
僕は、主に4の雛形作ってどう変わったのか観察しつつ、細かいところはソース覗きました。
Avatar
なるほど。それが一番確実ではありますね。
9:45 AM
これだけみんなが使うツールとしては間違えてる感がありますが😇
Avatar
今ちらっと上のドキュメント見ましたが、僕が気になったところは追従してましたし、信用できそうです👍
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
🙏 1
Avatar
@mono おお、よかったです。
Avatar
これも良かったです。当時としては正確そうですが、微妙に書き方違うところあります。 https://qiita.com/jpmartha/items/948a86bbb7d3e9240ce4
この記事は、Swift Package Manager (以下 SwiftPM) の Version 3 から 4 への変更内容をまとめたものです。 有効に活用するためにはさらに掘り下げていきたいところですが、この記事では概要にとど...
Avatar
ありがとうございます。
9:51 AM
↓の dev が気になってるんですが、ちゃんとインストールできてないでしょうか? $ swift package --version Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13126)
Avatar
どうなんだろうXcode9環境に戻ったら確認して見ます。
🙏 1
Avatar
Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13126) 同じく。
Avatar
僕は川にいるので家に戻ったら調べます🏃…と打ってたら、みんなそれっぽいですね( ´・‿・`)
Avatar
Observableの隠語と認識してしまった、リアル川のほうですね?
Avatar
Observableの隠語ww
Avatar
多摩川です🤕
Avatar
Observable<多摩>
😇 2
Avatar
みんな川好き
Avatar
https://github.com/apple/swift-package-manager/blob/b3074523e1e3a4c280829a1f5af6e4c9d3543714/Sources/Utility/Versioning.swift#L83-L85 isDevelopment が取れたコミットは swift-4.0-branch にもないので、忘れ去られているだけなのかと。
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
PRチャンス
Avatar
同じでした ➜ ~ swift package --version Apple Swift Package Manager - Swift 4.0.0-dev (swiftpm-13126) # ついでに ➜ ~ DEVELOPER_DIR=/Applications/Xcode-8.3.app/Contents/Developer swift package --version Apple Swift Package Manager - Swift 3.1.0 (swiftpm-12084)
Avatar
その後、みなさんのおかげで無事対応できました🙂
🎉 1
3:02 AM
Swift 3 の頃のシンプルな Package.swift 好きだったんですけどねぇ・・・。↓ swift package init で生成されるテンプレート。 BEFORE import PackageDescription let package = Package( name: "Swiftor" ) AFTER // swift-tools-version:4.0 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "Swiftor", products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. .library( name: "Swiftor", targets: ["Swiftor"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages which this package depends on. .target( name: "Swiftor", dependencies: []), .testTarget( name: "SwiftorTests", dependencies: ["Swiftor"]), ] )
Avatar
すべて明示する感じになりましたよね。
3:04 AM
3の時にexcludeで弾いてた場合だと、書き方変わっただけで記述量大差無いですね。 (edited)
Avatar
はい。 targets 省略でも、デフォルトとして解釈してくれてもいい気がするんですけどねぇ・・・。
3:06 AM
まあ、自動生成なんでいいんですが、初見でも何の疑問もなく理解できる BEFORE は好きでした。
🐶 1
Avatar
Package.resolved を更新したくて carthage update 相当のことをするにはどうすればいいんだと思って↓見たらまだ pinning とか書いてあってがっかりしてたけど普通に swift package update でできた。 https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
omochimetaru 9/22/2017 3:21 AM
$ rm Package.resolved でごまかして生きてる
Avatar
ひどいw
Avatar
Swift Package Manager 4のマニフェストにマイグレーションdone( ´・‿・`)ビルド中に詰まってしまい一旦断念してたけど、それも一緒に解消されたみたい( ´・‿・`)
👍 2
Avatar
SwiftPMのgenerate-xcodeproj、Package.swiftについてのターゲットが作られて、そこで import PackageDescription を Cmd + Click すると
2:39 AM
Package.swiftに関わるクラス定義が見えるので
2:39 AM
書き方わかって便利と思ったけど
2:39 AM
extension Dependency { public static func target(name: String) -> PackageDescription.Target.Dependency public static func product(name: String, package: String? = default) -> PackageDescription.Target.Dependency public static func byName(name: String) -> PackageDescription.Target.Dependency }
2:39 AM
PackageDescription.Target.Dependency となるべくところが Dependency になっていて
2:40 AM
PackageDescription.Package.Dependency も存在するのでよくわからなくなっている
2:41 AM
これってSpmは関係ないXcodeの型定義表示機能のバグかな
Avatar
試そうとしたらimport PackageDescriptionModule compiled with Swift 4.0 cannot be imported in Swift 4.0.1: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4/PackageDescription.swiftmodule って言われて定義をひらけなかった。
Avatar
僕の環境は Version 9.0.1 (9A1004) + 同梱ツールチェイン です
Avatar
ああ、Xcode 9.1 betaだった。
Avatar
な、なるほど
Avatar
よくわかってないんですが、 canImport って SwiftPM で管理された二つの独立した(別リポジトリの)パッケージ間で利用することはできるんでしょうか?
5:37 AM
たとえば、 A, B, C の三つのパッケージがあって、 A に canImport(B) が書いてあって extension が生やされていて、 C が A と B の両方に依存している場合にはその extension が使えるけど、 A にしか依存していない場合はその extension が使えないとか。
5:38 AM
A がビルドできるためには canImport(B) とはいえ A が B に依存していないといけない気がしていて、そうすると常に canImport(B) が真になる気がします。 optional な dependency が記述できないと実現できなさそう。
Avatar
swiftc的にはimport pathの中に置いてあるモジュール + システムパス を検索してるから、 SPMがCを解決したときに Bが入ってれば ABC 、なければ AC が検索パスに展開されて、 そのもとで諸々がコンパイルされてうまくいきそうな気がする
Avatar
A の Package.swift の dependencies はどうなる?
Avatar
そこでは指定してないけどCのためにとってきたBを canImportのときには見つけるんじゃないかってアイデアだけど、
Avatar
B に依存しないと canImport(B) の内部を解決する方法がないし、依存してるなら C も間接的に B に依存することになって常に canImport(B) が満たされそう。
Avatar
それとも完全にPackage.swiftだけに依存して隔離されてビルドされてるんだろうか
5:42 AM
内部を解決するってどういう意味ですか?
5:42 AM
コンパイル時分岐だから、見つからないときは全部無視では。
Avatar
A の Package.swift に一切 B の情報がないと、 A 単体で見たときにビルドできなくない?
5:43 AM
つまり、 A 単体では swift test でテストすることすらできないってこと?
Avatar
単体で見たときに canImport(B) が false になるからその範囲のソースコードは無かったことになるってこと
Avatar
それはさすがに辛くないかな?
5:43 AM
まあでもその仮定なら動作しそう。
Avatar
え、でもいまも #if os(iOS) って
5:43 AM
そういう挙動ですよね
Avatar
現実のオペレーション的には辛そうだけど。
5:44 AM
でも #if os(iOS) は OS を切り替えてテストできるけど
5:44 AM
#if canImport(B) はどうやっても A のリポジトリ単体でテストできなくなっちゃうよ。
5:44 AM
あーちがうか
5:44 AM
テストのターゲットに
5:44 AM
書けばできるのか。
Avatar
Bがあるやつとないやつの2種類用意すればよさおすですね
Avatar
A は B に依存しないけど、 A のテストを B に依存させればいいんだ。
Avatar
Bが無かった場合にコンパイルが通るかのテストは別途必要ですね
Avatar
まあテストパッケージが二つでもいいな。
Avatar
#if canImport(B) の内部で書いたコードが、Bが無いときにも必要な関数が混ざっていたりする可能性がある
Avatar
確かに。
Avatar
SwiftPMのMLも受信するかあ・・・
Avatar
ATests と ATestsWithB とかを作ればいいのかな。
Avatar
そろそろややこしくなってきたし。
5:47 AM
are?
Avatar
canImport の Proposal は swift-evolution に出てるよ
Avatar
いえ、SwiftPMそれ自体の
5:47 AM
Slackなんでしたっけ。
Avatar
SwiftPM の改変も swift-evolution に出てないっけ?
Avatar
本当に全部出てんのかな
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
5:48 AM
こういうのとか。
Avatar
Package.swiftの記述に関するものは、全てswift-evolutionに出てる気がします。
Avatar
なるほど
Avatar
コマンドラインオプションとかの機能追加は、出ていないものもあるかと。
Avatar
ふむふむ
Avatar
swift runみたいなサブコマンド?レベルの追加は出てる。
Avatar
ターゲットの記法が細かくなったやつとか swift runとかは
6:08 AM
プロポーザルは目を通してるから知ってたけど
6:08 AM
なんかわからない感じがあるんだよなあ
Avatar
swift test --filter <test pattern>みたいなオプションとかはSlackとかで話されて追加されてる気がする。
Avatar
なるほど。そういうのってswiftpm slackのgeneral?チャンネルですか?
Avatar
ですね。
Avatar
なるほど。ながめてみます。
Avatar
canImportはswiftpmのSlackで話された形跡がないですね。
6:13 AM
誰もSwiftPMでのcanImportの運用について気づいて(気にして)ないんじゃないかな? (edited)
Avatar
古い Proposal はありますよね?
6:15 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
6:15 AM
Status: Implemented (Swift 4.1)
Avatar
ああ、これ自体は SwiftPM と関係ないから
6:16 AM
SwiftPM 側で意識されてないという話なのか。
Avatar
Package.swift内でcanImportを使う?というのも考えたけど、swift test -vの出力を見る限りPackage.swiftのパースでは最低限のimport pathしか設定されていない。
Avatar
Package.swift 内で canImport 、なんかメタでヤバそうな感じだ・・・
Avatar
SwiftPMのSlackで聞いてみるといいんじゃないかな…
Avatar
canImport の実装読んでみても良さそうですね。 canImport 自体は SwiftPM と独立に動きそうなので、 canImport の厳密な判定条件がわかれば実際にどういう挙動をするのか理解できそうです。
Avatar
↑のMLのスレ読んだけど誰もSPMの話ししてなかった
Avatar
ちょっと議論追えてないですが、canImport 自体の評価はparse時なので、そのソースがコンパイルされるときに、検索パス上にそのモジュールがあればtrue、無ければfalseとして評価されるだけですよ。
Avatar
なるほど。
Avatar
じゃあ @omochimetaru の想定通りに動きそうな感じか。
Avatar
C が A,B に依存していて、Aに canImport(B) が書いてあるとすると、 C のビルド時に A, B どちらが先にコンパイルされるかでAのコンパイル結果が変わったりするのか?という疑問があるけど、どうなんでしょうね。 (edited)
Avatar
swift package generate-completion-script zsh > ~/.oh-my-zsh/custom/plugins/swift/_swiftしてzshがswiftのコマンドラインオプションを補完できる様にした。 $ swift build -- build sources into binary products package -- perform operations on Swift packages run -- build and run an executable product test -- build and run tests (edited)
☺ 1
3:40 AM
SwiftPMに気になるパッチが。 無駄に flatMap にしちゃってる例のアレかこれ
Avatar
String to Intっぽいですけどその場合Int?が返るのでflatMapが正しいのでは?
Avatar
間違ってる、と思ったらすでにikesyoさんがコメントしてた。
Avatar
あれ、、、本当だ・・・
Avatar
swift build [1/1] Compile CYaml src/writer.c Compile CYaml src/reader.c Compile CYaml src/scanner.c Compile CYaml src/parser.c Compile CYaml src/emitter.c Compile CYaml src/api.c Compile Swift Module 'Yams' (15 sources) Compile Swift Module 'render0' (1 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/render0 Fetching https://github.com/jpsim/Yams.git Cloning https://github.com/jpsim/Yams.git Resolving https://github.com/jpsim/Yams.git at 0.5.0 swift build end
12:52 PM
$ swift build のプロセス出力をリダイレクトしているだけなのに
12:52 PM
↑なぜか前後順が入れ替わる・・・
12:52 PM
SwiftPM内部で、 git を叩いたときと、コンパイラを叩いたときで、それらの出力を流したりキャプチャしたりしているからっぽいんだけど
12:53 PM
なんとかならないだろうか SPMのソースも眺めたけどよくわからず
12:55 PM
swift-package-manager - The Package Manager for the Swift Programming Language
swift-package-manager - The Package Manager for the Swift Programming Language
12:57 PM
こっちかな
1:03 PM
$ touch a.txt $ tail -f a.txt $ swift build >> a.txt これだけでも再現した
Avatar
そこらへんは見たんですけど
1:56 PM
Process クラスは、redirectOutput が true だと ↑のコードを使って
1:56 PM
サブプロセスのstdout と stderr をパイプにつなげた上で、
1:57 PM
それがcloseされるまでreadしつづけて、closeされた完全なバイト列を 変数に保存するだけのスレッドを立ち上げて
1:57 PM
waitUntilExitメソッドではそのスレッドの完了をjoinで待つんですね
1:57 PM
なので、Processクラスが出力を捕まえることまではわかっているんですが
1:57 PM
gitのcloneやfetchの操作をするところでは
1:58 PM
それをラップしたcheckNonZeroExitメソッドを叩いて結果を捨てていて
1:58 PM
Processクラスが捕まえた結果を、 SwiftPM自体の出力として改めて流す処理が見当たらなくて
1:59 PM
読んだ範囲だとキャプチャするだけで出力してないので、現状の挙動とも一致しなくて謎です。
Avatar
swift-package-manager - The Package Manager for the Swift Programming Language
Avatar
1と2はstdoutとstderrだから、そのelseのフローは、 subprocessのstdout/err を、呼び出し側のstdout / err につなげているのでは?
Avatar
ああ、こっちを通らないのね。
Avatar
checkNonZeroExitでもredirectOutput = true だし、 Processのコンストラクタも デフォルトで = true です
2:05 PM
(これがfalseになるフローを見つけられてない可能性もある
2:05 PM
あー、チェックアウトしてxcodeprojで開いたほうが良い気がしてきた。
Avatar
これらはgitのメッセージなの? Fetching https://github.com/jpsim/Yams.git Cloning https://github.com/jpsim/Yams.git
Avatar
あ〜〜・・・ そうじゃない可能性は考慮して↓の記事を見ていたけど、 https://stackoverflow.com/questions/37669115/how-to-redirect-full-output-of-git-clone-to-a-file よく見るとgitの出力と違う文字列ですね・・・
When I run git clone like usual, I see this: $ git clone https://github.com/bensmithett/webpack-css-example Cloning into 'webpack-css-example'... remote: Counting objects: 179, done. remote: Total...
2:10 PM
しまった、そういうことか。
2:11 PM
ありがとうございます
👍 1
Avatar
Swift.print()にバッファが効いてるのかな?>リダイレクトで入れ替わる。
Avatar
SwiftPMのslackのhelp channelに投稿して寝たけど無視されて他の話題になっちゃったな・・・
Avatar
あとはSwift.print()が出力先をflockしてるっぽいのも気になってるけど、再現実装が必要かな。
10:26 AM
スレッドサニタイザーの話題が継続してましたね>Slack
10:30 AM
再現実装書いたらコメントしたかったけど、明後日くらいまでは手を付けられないかな。
Avatar
ふむふむ。見ていただいてありがとうございます。
Avatar
SwiftPM SlackはankitさんがU.S.へ移動してから静かになってしまいましたね。
Avatar
Ankitさんってめちゃめちゃコミットしてるけど、メイン?開発者なんですか?
3:26 AM
最近見始めたからよくわからないです
Avatar
去年の8月にApple入って、一年インドでリモートでした。
Avatar
ほほー なるほど。
Avatar
それ以前から積極的にコミットしてたけど、入社以降はメイン開発者な感じですね。
Avatar
ankitさんが入ってなかったらSwiftPMは死んでたと思う。
Avatar
SwiftPMが始まった頃、homebrewのMax HowellがAppleに引き抜かれて携わってたって聞いて
3:32 AM
そんな感じかと思ってました。
Avatar
結構すぐ辞めちゃいましたからねー
3:34 AM
大企業はやっぱ合わなかったわ。的なツイートしてました。
Avatar
へえ〜、そうだったんですね。
Avatar
ankitさんインドにいた時は、タイムゾーンが近かったからSlackでリアルタイムに喋りやすかった。
3:56 AM
Apple社内とのコミュニケーションにもSlackが大きな部分を占めてて、それでレスポンスが良かったのだろうと想像。
Avatar
swift buildで成果物が置かれるディレクトリのパスを取得: $ swift build --configuration release --show-bin-path /Users/norio/github/gysb/.build/x86_64-apple-macosx10.10/release
4:39 AM
Swift 4.0からパスにplatformも入る様になったので追加された。
Avatar
SwiftPM Slackの#helpにコメント書いたよ。
5:39 AM
やっぱりバッファリングが問題で、SwiftPMがsetlinebuf(Darwin.stdout)をすると直る。> swift buildの出力をキャプチャすると順序が入れ替わる。 (edited)
Avatar
おお、ありがとうございます!
6:07 AM
あとで確認します
Avatar
とりあえず、setlinebuf()の利用自体が正しいのかはよくわかっていません。これについて、僕自身ではSwiftPMへPRを出すモチベーションは低いです。omochiさんのところで動作確認出来て、その気があるならPRを書かれると良いのではないかと思います。
Avatar
なるほど。僕もunixパイプのバッファリング周りの振る舞いについてはちゃんとした知識がないので、ひとまずbugsの反応を待ちます。
Avatar
SwiftLintとSourceKittenの次のリリースはSwiftPMで-Xswiftc -static-stdlibを使ってビルドしたバイナリになりそうです。 https://github.com/realm/SwiftLint/pull/1951 https://github.com/jpsim/SourceKitten/pull/443
Use swift build --configuration release --static-swift-stdlib for building swiftlint
Same as realm/SwiftLint#1951 This does not depends on #442 directly, but should be merged after that.
Avatar
swift-buildをXcodeでデバッグ実行した時に"could not find llbuild"エラーになる不具合を修正しました。 https://bugs.swift.org/browse/SR-6371 (edited)
Avatar
SwiftPMに0.1.0のバージョンタグがついて、Dependencyとして利用できる様になったぽい。https://github.com/apple/swift-package-manager/releases/tag/0.1.0
Avatar
omochimetaru 12/1/2017 1:42 AM
タグついてなかったのかw
Avatar
A -> B -> C というような依存関係があって、 B -> C の依存がブランチで記述されていた場合に、 A を swift build したり swift package update したりするとエラーになるんですが、そういうものなのでしょうか? B -> C のブランチによる依存とは、 B の Package.swift に↓ように書いた場合のことです。 .package(url: "https://github.com/foo/C.git", .branch("master"))
1:47 AM
↓のリポジトリを clone して swift package update するか、もしくは Package.resolved を削除および swift package reset してから swift build すると再現します。 A = swtws, B = TweetupKit, C = OAuthSwift です。 https://github.com/swift-tweets/swtws
swtws - A command line tool for Swift Tweets
Avatar
norio_nomura 1/17/2018 1:59 AM
そういうものみたいです。SwiftLintでも同様のissueがありました。 https://github.com/realm/SwiftLint/issues/1962
New Issue Checklist Updated SwiftLint to the latest version I searched for existing GitHub issues Bug Report So I am trying to work on a SPM project using the SwiftLintFramework library and whe...
🙏 1
Avatar
おお、そうするとライブラリには .branch は使えないですね・・・。使った瞬間に他のライブラリがそのライブラリに依存できなくなってしまう😣
Avatar
norio_nomura 1/17/2018 2:20 AM
AでBを使う時にswift package edit Bを使ったら、開発途中のBを使えませんかね? (edited)
Avatar
ダメっぽいですね・・・。もしかして .branch じゃなくて .revision なら大丈夫ですか?
Avatar
norio_nomura 1/17/2018 2:45 AM
あ、swift package edit Cでは?
2:45 AM
swtsだとswift package edit OAuthSwift
Avatar
うーん、うまくいかなさそうな感じです。よくわからないのは、 Package.resolved を手で書き換えて( swift package update ではなく) swift build してもうまくいかないことですね・・・。
2:55 AM
Package.resolved がある状態で swift build しても依存解決のための何かが実行されるんですっけ??単に clone/fetch してビルドするだけかと思ってました。
2:58 AM
今、 TweetupKit の 0.2.1 と 0.2.2 で TweetupKit の中で依存する OAuthSwift の向き先がフォーク先からオリジナルに変わってるのもややこしいかもです。
Avatar
norio_nomura 1/17/2018 3:03 AM
やっぱりswift package edit Bだった。 $ git reset --hard HEAD is now at 66ed003 Update TweetupKit $ swift package edit TweetupKit Fetching https://github.com/swift-tweets/tweetup-kit.git Fetching https://github.com/swift-tweets/OAuthSwift.git Fetching https://github.com/kylef/Commander.git Fetching https://github.com/koher/PromiseK.git Fetching https://github.com/kylef/Spectre.git Cloning https://github.com/swift-tweets/tweetup-kit.git Resolving https://github.com/swift-tweets/tweetup-kit.git at 0.2.1 Cloning https://github.com/koher/PromiseK.git Resolving https://github.com/koher/PromiseK.git at 3.0.0-alpha.4 Cloning https://github.com/kylef/Spectre.git Resolving https://github.com/kylef/Spectre.git at 0.8.0 Cloning https://github.com/swift-tweets/OAuthSwift.git Resolving https://github.com/swift-tweets/OAuthSwift.git at 2.0.0-beta Cloning https://github.com/kylef/Commander.git Resolving https://github.com/kylef/Commander.git at 0.8.0 swift package edit TweetupKit 3.07s user 2.89s system 53% cpu 11.056 total $ (cd Packages/TweetupKit;git checkout master) Previous HEAD position was 71f0117... Merge pull request #11 from swift-tweets/dev-0.2.1 Switched to branch 'master' Your branch is up to date with 'origin/master'. $ swift build Updating https://github.com/koher/PromiseK.git Updating https://github.com/swift-tweets/OAuthSwift.git Updating https://github.com/kylef/Commander.git Updating https://github.com/kylef/Spectre.git Updating https://github.com/swift-tweets/tweetup-kit.git Fetching https://github.com/OAuthSwift/OAuthSwift.git Cloning https://github.com/OAuthSwift/OAuthSwift.git Resolving https://github.com/OAuthSwift/OAuthSwift.git at master Compile Swift Module 'PromiseK' (2 sources) Compile Swift Module 'Commander' (9 sources) Compile Swift Module 'OAuthSwift' (24 sources) … (edited)
Avatar
↑の状態で swift package reset してから swift build するとエラーになりませんか?
Avatar
norio_nomura 1/17/2018 7:31 AM
swift package resetするとeditモードから外れるので、その後にswift buildしてエラーになるのは当然かな。
Avatar
norio_nomura 1/17/2018 1:15 PM
そうか、swift package edit TweetupKit --revision 0.2.2すれば(cd Packages/…; git checkout …)とかしなくて良いのか。
Avatar
swift-package-manager - The Package Manager for the Swift Programming Language
12:42 AM
swiftpmがpkgconfigでライブラリをリンクできるようになってたから
12:42 AM
システムインストールされてるCライブラリについては綺麗に組み込めるようになった
12:43 AM
しかし、プロジェクトごとにローカルビルドしてるCライブラリについては
12:43 AM
-Xlinkerでサーチパスを渡す必要があるので
12:44 AM
一貫してパスを渡せるように、swift build等をMakefileなどでラップする必要がある
12:45 AM
We plan to provide solution to avoid passing the flag in commandline.
12:46 AM
早く対応進んでほしい これがないとなかなかC資産をフルに使ったSwift開発ができない
Avatar
欲しい人が実装するしかない
Avatar
できなくもないが他にやりたいことが多すぎる・・・
12:48 AM
コミュニティ的にはspmはあまり活発じゃないのかな?
12:48 AM
PRは監視してるけどあんまりモリモリ進んでないように思う
12:49 AM
Cファイルが入ってたらCターゲットってのと同じように、 Libsディレクトリにスタティックライブラリが入ってたら、それをリンクするだけのターゲット って仕様がいいかなーと思う
12:50 AM
ただOSや環境ごとに分けておかないといけないからそこらへんのフォルダ分けルールとかが悩ましい
Avatar
どこまでevolutionを通して決めないといけないのか?があまりはっきりしていない様に見えるのが、個人的には手を出しづらいところ。>SwiftPM (edited)
Avatar
たしかに・・・ 一応機能的なものはSE通しながら進んでるようには見えます
Avatar
omochimetaru 1/30/2018 2:50 AM
SwiftPMでObjectiveCのモジュールがあるとき、 swift build では -fmodule が有効化するのに swift package generate-xcodeproj の xcode では Build Settings > Enable Modules = NO になっているために モジュール対応モードでコンパイルされないため、 そのモジュール自身が @import を使っているとコンパイルできない というトラブルを踏んでるんですが、何か知見のある人いますか? 該当のリポジトリで立ってるissueでは手動設定が言及されているけど https://github.com/stephencelis/SQLite.swift/issues/691#issuecomment-339612232 (edited)
Hello, I have compilation problem with Xcode. Compilation was successful with swift build -Xlinker -lsqlite3 but i can't reproduce the same in Xcode. The module SqlLiteOBJ gives 22 errors. Do you h...
Avatar
omochimetaru 1/30/2018 4:38 AM
@import じゃなくて #import に書き換えてモジュール=NOのままやってみたら、今度は libsqlite3の自動探索がされなくなって(モジュールじゃないから) modulemapのlinkパラメータがxcodeprojに反映されないから駄目だった・・・
Avatar
norio_nomura 1/30/2018 8:04 AM
そのあたり改善するはずのPRが、最初の申請から1年近くに… https://github.com/apple/swift-package-manager/pull/1406
This was rewritten #955 for master. This PR increases the portability of generated Xcode project by reducing the use of module.modulemap which absolute path contains. If clang module has umbrella...
Avatar
omochimetaru 1/30/2018 8:07 AM
ウオオまさにコレっぽそう
Avatar
辛い・・・
ddunbar commented 26 days ago Sorry for the very long delay, I am testing and experimenting with this today...
Avatar
SwiftPMでCのAPIを使う時に、apinotesを使えるらしい。 https://bugs.swift.org/browse/SR-6969
Avatar
norio_nomura 3/9/2018 12:15 AM
Package.swiftとは別のSwiftWorkspace.jsonを導入しようというモノらしい。 https://forums.swift.org/t/package-manager-workspace/10667
Hi, I would love to get some feedback on a draft proposal for introducing a feature called “workspace”. https://github.com/aciidb0mb3r/swift-evolution/blob/workspace/proposals/NNNN-package-manager-workspaces.md Package Manager Workspace Proposal: SE-NNNN Author: Ankit Aggarwal Review Manager: TBD Status: Discussion Introduction This proposal introduces a new concept called “workspace” to help Swift package authors to develop packages that depend on each other. Motivation Swift packa...
Avatar
omochimetaru 3/9/2018 1:00 AM
モチベーションはめっちゃわかる
1:01 AM
設定ファイルはswiftじゃなくてjsonなの?ってツッコミに対する回答がかなしいね
But I think that’ll be slow and painful in practice
Avatar
Hi, This draft proposal introduces extensible build tools in the package manager. It will allow package authors to integrate community build tools in the build process! https://github.com/aciidb0mb3r/swift-evolution/blob/extensible-tool/propos...
4:09 AM
Swiftで書いた独自ツールでビルドをフック出来るようにする提案かな?
Avatar
かなり大掛かりな感じ。
Avatar
norio_nomura 3/14/2018 4:38 AM
今はllbuildswift-compilerプラグインを組み込んだ外部実行ファイルswift-build-toolでビルドしているのを、llbuildのSwiftバインディングを使ってSwiftPM内から直接呼び出す様に変えることでswift-compiler以外のプラグインを使える様にし、PackageExtension.swiftでカスタムプラグインとそれを利用したルールを定義できる様な仕組みになるぽい? (edited)
Avatar
norio_nomura 4/2/2018 3:45 AM
swift test --generate-linuxmainなんて出来るようになってたのね。
Avatar
その機能なくて、自分で作ってました...。やっとできるようになったんですね
Avatar
Taketo Sano 4/4/2018 7:23 AM
swift PM を使って build したものを、ここにあるようなやり方で REPL で読み込めたら良いなと思うのですが、僕なりに試した限りだとできなそうでした。 (edited)
7:25 AM
swift -I .build/debug/ -L .build/debug/ こういう風にすれば、import するとこまではできたのですが、実際に使おうとすると中身がないというようなことを言われてしまいます。 (edited)
7:26 AM
恐らくこれは上の記事にあるように lib がないからだと思うのですが。
7:31 AM
もし分かる方いたら教えてください🙏
Avatar
Package.swift の products .library( type: .dynamic ) であることを確認して、 import PackageDescription let package = Package( name: "MyPMLib", products: [ .library( name: "MyPMLib", type: .dynamic, // < HERE targets: ["MyPMLib"]), ], ... (edited)
11:32 AM
これで実行できました。 -l{モジュール名} $ swift build Compile Swift Module 'MyPMLib' (1 sources) Linking ./.build/x86_64-apple-macosx10.10/debug/libMyPMLib.dylib $ swift -I .build/debug/ -L .build/debug/ -lMyPMLib Welcome to Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.39.1). Type :help for assistance. 1> import MyPMLib 2> hello() Hello? 3>
😂 1
Avatar
おぉ…!!!!!
11:33 AM
ありがとうございます、後でやってみます!!!
Avatar
Taketo Sano 4/4/2018 3:42 PM
ぬぉお、できました!
Avatar
Package.swiftで、「MacかLinuxか」以外の、#if や 普通の if での分岐をしている例ってありませんか?
Avatar
おお。でもこれは・・・実質的に分岐してないですね
Avatar
ですねぇw
10:43 AM
Avatar
おー、言語バージョンなるほど。excludeは知らなかった。
Avatar
そうやって検索したらよいのか。ありがとうございま
10:49 AM
Avatar
if filename:Package.swift path:/ NOT "os(" のほうが正確っぽい。
Avatar
参考になりました🙏
Avatar
norio_nomura 5/2/2018 2:00 AM
アセンブラのソース.Sを含むライブラリをSwiftPMでビルドしたかったのだけど、.Sはサポートされてなかった。
2:00 AM
.S.cppの中に埋め込むとか出来ないかな…
Avatar
Swift 4.2のswift package generate-xcodeprojには、Debug Build ConfigurationのSWIFT_ACTIVE_COMPILATION_CONDITIONSSWIFT_PACKAGEを設定しないバグがある。 https://bugs.swift.org/browse/SR-7965
Avatar
swift package generate-xcodeprojがC言語系のターゲットを生成する際module.modulemapにフルパスでヘッダが記載されるため生成されたXcodeプロジェクトがポータブルにならない、を改善するパッチがマージされました。 https://github.com/apple/swift-package-manager/pull/1602
…present This makes the C language frameworks actual frameworks when umbrealla header is present in the target. It should be possible to embed these targets in other Xcode projects using subproject...
Avatar
ターゲットと同名のアンブレラヘッダが存在する場合、SwiftPMはmodule.modulemapを生成せず、Xcodeが自動生成する仕組みを利用する様になります。
👏 4
Avatar
omochimetaru 6/13/2018 2:33 AM
最近swiftpmのプルリクがたくさん処理されてるけど
2:33 AM
アップルの担当者が増えたりしたんですか?
Avatar
yutailang0119 6/13/2018 10:05 AM
Swift 4.0 -> 4.1くらいの間で swift package generate-xcodeproj で生成されるInfo.plistのBundle identifierがcom.yyy.Xxxxみたいなのじゃなくて、パッケージ名Xxxxだけになるようになってしまったような感じしてるのですが、どこで変わったか分かる人いないですかね
Avatar
一気にprが増えたのはtry! Swift San Joseの効果ですかねー
Avatar
ああー!
Avatar
swift, foundation, swiftpm, swiftnioの4つが対象という感じだったので
Avatar
パッケージ名Xxxxだけになるようになってしまった
swift-4.0-RELEASEで既にそうなってますね。
Avatar
yutailang0119 6/13/2018 1:10 PM
swift-4.0-RELEASEでなってるんですね…Xcode 9.2の時はリバースドメインになってた気がしてるんですが、勘違いかな Bundle Identifierがパッケージ名になるのって、意図した挙動なんですかね?iOSのイメージだとリバースドメインの形式な気がしてる
Avatar
norio_nomura 6/13/2018 1:24 PM
あ、正確にはパッケージ名ではなくターゲット名。 swift-3.0-RELEASEでもターゲット名になってました。
1:26 PM
SwiftPMにリバースドメインを教える仕組みが無いから仕方ないと思えます。
Avatar
yutailang0119 6/14/2018 12:42 AM
あーターゲット名ですね
12:44 AM
ドメインの方式にならないと、将来iOSで使えるようにする時に、code signing周りで不都合になるのではないかなと思ってたりしてます
Avatar
その通りではあるのですが、自動生成はあくまで最低限Xcodeでビルド出来る様にするだけで、iOS等で利用する場合はそれら生成したプロジェクトを調整してリポジトリへコミットするのが前提になっているのだと理解しています。
Avatar
omochimetaru 6/14/2018 1:09 AM
iOS向けにはInfo.plistとかも必要だから、そうしたファイルを指定する機能が実装されて解決するんじゃないでしょうか
Avatar
yutailang0119 6/14/2018 1:17 AM
なるほど、背景にDIKitでこういう問題 https://github.com/ishkawa/DIKit/issues/53 があって、現状generate-xcodeしたあとに書き換えるしか方法がなさそうで、どうにか方法ないのかと調べているのでした まだiOSにどうにかするにはいろいろと不都合が多いんですよね...
Environment DIKit 0.3.2 Xcode 9.3.1 Swift 4.1 Current behavior There is no problem with the simulator, but applications depend on DIKit can not be installed on the actual iOS machine. -[MIExe...
Avatar
omochimetaru 6/14/2018 1:26 AM
ですね。spmのiOS対応には、この、プラグイン機能の実現の後で進むと予想してます https://forums.swift.org/t/package-manager-extensible-build-tools/10900
Hi, This draft proposal introduces extensible build tools in the package manager. It will allow package authors to integrate community build tools in the build process! https://github.com/aciidb0mb3r/swift-evolution/blob/extensible-tool/proposals/NNNN-package-manager-exten...
1:27 AM
でも、スケジュールがハッキリしてないので、iOSに関しては今の所はspmは使わないのが無難と思ってます
Avatar
norio_nomura 6/14/2018 1:27 AM
DIKitに限っていえば、generate-xcodeprojを使わなければいけない理由がCYamlmodule.modulemap内のパスが問題であるなら、CYamlターゲットをDIKit自身で持つ様にすれば解決可能です。 (edited)
1:28 AM
似た様なことをYamsでやってるので。 https://github.com/jpsim/Yams
Yams - A Sweet and Swifty YAML parser.
Avatar
(Yams 便利に使ってます。ありがとうございます 😃
❤ 1
Avatar
yutailang0119 6/14/2018 1:42 AM
うおおお、見てみます! @norio_nomura @omochimetaru ありがとうございます!
Avatar
This adds a --watch option to generate-xcodeproj subcommand. SwiftPM will do the necessary configuration and exec to the watchman-make tool. If the tool can't be found on the system, it'll ...
11:18 AM
自動でxcodeproj再生成だって
Avatar
norio_nomura 6/22/2018 1:27 AM
DIKitでgenerate-xcodeprojした際CYamlターゲットのmodule.modulemapにフルパスが含まれる問題、Swift 4.2のスナップショットでswift package generate-xcodeprojするだけで解決する様になりました。 (edited)
1:32 AM
SwiftPMは作成済みのGeneratedModuleMap/CYaml/module.modulemapを削除してくれませんが、生成されたXcodeプロジェクトはmodule.modulemapを使わなくなるので、リポジトリから削除可能になります。 (edited)
Avatar
omochimetaru 6/22/2018 1:47 AM
おお
Avatar
norio_nomura 6/22/2018 2:13 AM
あ、ダメだ。
2:13 AM
生成されたXcodeプロジェクト自体に依存するパッケージをチェックアウトしたフルパスが含まれるから、意味がなかった… (edited)
2:14 AM
真の解決は、Carthageでサブモジュール管理してXcodeプロジェクトを手動で管理するしかないや。
2:15 AM
cocoapodsでもいけるのかな。
Avatar
omochimetaru 6/22/2018 2:16 AM
Carthage submodule + manual Xcodeproj 最強説
Avatar
norio_nomura 6/22/2018 2:20 AM
DIKitの場合、SourceKittenはXcodeプロジェクトが含まれてるけど、Stencilには含まれていないのがネックかな。 https://github.com/ishkawa/DIKit/blob/master/Package.swift
DIKit - A statically typed dependency injector for Swift.
Avatar
yutailang0119 6/24/2018 4:52 PM
なるほどなるほど
Avatar
swift-DEVELOPMENT-SNAPSHOT-2018-07-11-aでPackageDescription API v3が削除されたため、いくつかのパッケージがビルド出来なくなった… https://github.com/apple/swift-package-manager/commit/d9ae3a84d4860cd601ff2f336859a46f11cccc0c
Avatar
omochimetaru 7/26/2018 1:14 AM
rdar://problem/41342798 SwiftPM is not warning about non whitelisted flags rdar://problem/40260898 [SR-7690]: SwiftPM does not print any warnings which is must be emitted at all during build plan i...
1:15 AM
5月に報告してたやつ、アンキットさんによって治った
Avatar
norio_nomura 8/1/2018 11:39 PM
SwiftPMでもswift test 2>&1 | xcprettyとすればxcpretty使えるらしい。 https://forums.swift.org/t/swift-test-output-format/14702/13
This case with xcpretty is actually because swiftpm outputs test output to stderr, not stdout. So you need to run swift test 2>&1 | xcpretty
Avatar
omochimetaru 8/14/2018 9:05 AM
Carthageの binary サポートの挙動が微妙だ・・・
9:05 AM
carthage update した時点では /Users/omochi/Library/Caches/org.carthage.CarthageKit に zip ファイルがダウンロードされるだけで
9:05 AM
carthage build してはじめて、 Carthage/Build/iOS に zip の中身が展開される
9:06 AM
そして carthage update --no-build だと zipの展開が行われない (edited)
Avatar
Carthage downloads and expand contents in zip file at build stage not checkout stage. Its weird. I want to add process that expanding contents in zip at Carthage/Checkouts when user run $ carthage ...
Avatar
duplicate issue立ってた。
Avatar
Package.swift が swift-tools-version:4.0 の状態で swift build すると #if swift(>=4.2) が正しく動かないみたい。これはバグ?
6:15 AM
#if !swift(>=4.2) print("<4.2") #endif print(CountableRange<Int>.self)
6:15 AM
というコードに対して、 $ swift --version Apple Swift version 4.2 (swiftlang-1000.0.36 clang-1000.10.44) Target: x86_64-apple-darwin17.7.0 $ swift run <4.2 Range<Int>
6:15 AM
となる。
6:16 AM
CountableRange<Int>.selfRange<Int> になってるから中身は Swift 4.2 らしく、正しく分岐できずに困ったことになりそう。 (edited)
6:19 AM
Swift 4.1 だとちゃんと CountableRange になってる。 $ swift --version Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2) Target: x86_64-apple-darwin17.7.0 $ swift run <4.2 CountableRange<Int> (edited)
Avatar
norio_nomura 8/28/2018 6:20 AM
#if swift(>=4.1.50)を使いましょう。 @swift-4.2.4 -swift-version 4 #if swift(>=4.1.50) print("4.1.50") #endif (edited)
Avatar
4.1.50 (edited)
Avatar
おお、過去に話されてましたね・・・ norio_nomura06/06/2018 > 話かわりますけど、Xcode 10 BetaはSwift4.1.50になるw Swift 4.2コンパイラに-swift-version 4を渡すと4.1.50になります。
6:22 AM
SwiftPM の swift-tools-version:4.0 の問題じゃなくて、コンパイラの -swift-version 4 時の挙動なんですね。
6:23 AM
互換モードでは CountableRangetypealias なんですね。そうじゃないと 4.2 と混ぜれないから当たり前か。なるほどー。
6:23 AM
ありがとうございました。
👍 1
Avatar
swiftpm でデバッグビルドのときだけ実行したい .testTarget を作ることはできるのでしょうか? @testable import がリリースビルドだと出来ないので、public なAPIをテストする テストターゲットと、internal なユニットテストを分けて、 swift test -c release のときには後者は実行しないようにしたいのです。 (edited)
Avatar
Package.swiftの中で #if DEBUG は使えるのかな
Avatar
だめっぽいです 😢
Avatar
https://github.com/apple/swift-package-manager/blob/master/Sources/PackageLoading/ManifestLoader.swift も見たけどconfigurationは何もしてなさそうですね……
The Package Manager for the Swift Programming Language - apple/swift-package-manager
Avatar
omochimetaru 9/19/2018 5:45 AM
たしかに普通にありそうな要望っぽいけどどうしたらいいんでしょうね
5:46 AM
個人的に @testable 使わないから気づかなかった
Avatar
環境変数は使えたと思うので import Foundation して ProcessInfo.processInfo.environment でどうにかするとか
5:49 AM
Streams of values over time. Contribute to ReactiveCocoa/ReactiveSwift development by creating an account on GitHub.
Avatar
Kishikawa Katsumi 9/19/2018 5:51 AM
リリースビルドでも-enable-testingを指定したら@testable importできません?
5:51 AM
なんか前にやった記憶があるんですよね。
Avatar
omochimetaru 9/19/2018 5:51 AM
(今手元で実験中)
Avatar
Kishikawa Katsumi 9/19/2018 5:52 AM
それかgenerate-xcodeprojしてxcodebuildでテストするとか。
Avatar
確かにReleaseでも@testable有効にしてテストするのはありかも。Xcodeでのテストで同じようなことはしています https://github.com/ReactiveCocoa/ReactiveSwift/blob/2463d83d0c896ac046c2b85377e583b72373b831/script/build#L35
Streams of values over time. Contribute to ReactiveCocoa/ReactiveSwift development by creating an account on GitHub.
Avatar
-Xswiftc -enable-testing@testable import はできるのですが、リリースビルドの成果物はそのままリリースに回したいので、、、というところで。
Avatar
なるほどー
Avatar
omochimetaru 9/19/2018 5:56 AM
/Users/omochi/temp/spmdb/Tests/zooTests/spmdbTests.swift:2:18: error: module 'zoo' was not compiled for testing @testable import zoo ^
5:56 AM
たしかに -c release のときだけここでこけますね、そのままやると。
Avatar
というか、最終成果物で、テストのサブセット(public APIテストのみ) をクリーンに回す方法が現状ないということ?
Avatar
ターゲットは分けないで、testable importするファイルは分けてそのファイル内で #if DEBUG で囲んでしまえば、きれいではないけどいける気はする
Avatar
omochimetaru 9/19/2018 5:58 AM
public API のテストだけなら 普通の import でできそうです
Avatar
おお、 テストファイル内での #if DEBUG は出来るのですね。
5:59 AM
それでいけそうです!
Avatar
omochimetaru 9/19/2018 5:59 AM
Linux向けの allTests の定義で Releaseで消えるやつは除去する必要がありそうですね
Avatar
たぶんターゲット内の各ファイルのビルド時は渡してくれる気がします(が確信はない)
Avatar
Kishikawa Katsumi 9/19/2018 6:00 AM
なんとなくわかってきました。 #If DEBUG @testable import zoo #else import zoo #endif ^ これと、それぞれInternalにアクセスするテストを囲う感じですね。
Avatar
Linux向けの allTests の定義で Releaseで消えるやつは除去する必要がありそうですね
めんどうそうw
6:04 AM
皆様ありがとうございます。 @testable import するテストはファイルを分けて、ファイル全体を #if DEBUG で囲う方向でやってみます。 (-D DEBUG が渡っていることは確認しました) (edited)
😀 1
Avatar
norio_nomura 9/19/2018 7:52 AM
#if canTestableImport(…) とかあれば良いのに。
Avatar
yutailang0119 9/19/2018 8:36 AM
swift package generate-xcodeproj の出力が、実行毎に変わるようになったのって、Swift 4.2からで合ってますかね?
8:38 AM
SwiftPMだとxcodeprojはignoreされる前提でgenerateされるとは知りつつ、別のツールに移行するしかないのかなの判断がつかない状態なので、わかる方いましたら https://github.com/ishkawa/DIKit/issues/58
I'm trying to support Xcode 10. However, the generated xcodeproj is changed every time when I execute swift package generate-xcodeproj . Swift Package Manager is not yet suitable for iOS. I thi...
Avatar
norio_nomura 9/19/2018 9:43 AM
xcodeprojを手動でメンテナンスしたくない理由って何なのだろう?
Avatar
omochimetaru 9/19/2018 9:44 AM
swift build でビルドできる必要があるので
9:44 AM
手動メンテした結果、xcodeprojではビルドできるが、swift buildではできない、みたいなことが起こったら嫌だし、
9:45 AM
SwiftPMがビルドに必要な知識は全て持ってるので、それをxcodeprojに書き写すのは機械にやらせたほうが間違いがないから (edited)
9:45 AM
と僕は思ってます
Avatar
norio_nomura 9/19/2018 9:52 AM
今のSwiftPMの仕組みだと、外部依存するパッケージが存在する時点で、生成したxcodeprojをリポジトリに入れても使えないよね。
Avatar
omochimetaru 9/19/2018 9:53 AM
外部依存というのが、例えばDIKitのような、独自のメタビルド機構の事なら、そうですね。
9:53 AM
メタプログラミングとかだったら、生成されたソースコードをコミットすれば良い場合もあるけど
9:53 AM
事前にコミットできないタイプのものは、SwiftPMでは対応できないですね。
9:55 AM
そのあたりは、SwiftPMのPackageExtensionが将来的に担うところ。 https://github.com/aciidb0mb3r/swift-evolution/blob/extensible-tool/proposals/NNNN-package-manager-extensible-tools.md
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - aciidb0mb3r/swift-evolution
Avatar
外部依存するパッケージはPackage.swift内のdependenciesの事。 生成されたxcodeprojには.build/checkouts下のパスが含まれるから、Xcodeでビルドする前にSwiftPMでもビルドしないといけないから、都度generate-xcodeprojするのと変わらない。
Avatar
ああ、そういうことか。
10:06 AM
実行毎に変わるようになった
ってそういう話なのかな?
10:07 AM
チェックアウトされたところのパスですけど、 なんか、ハッシュ値みたいな謎の数列が付与されたディレクトリにチェックアウトされていたけど、
10:07 AM
その数列に再現性があった気がする。
10:07 AM
本来はそこのレイアウトはSwiftPMのチェックアウト実行ごとに定まるから、xcodeprojは共有できなかったけど、
10:07 AM
実際は昔はそこが共有することもできていた?
Avatar
そこに再現性があっても、リポジトリに入ってない.build/checkoutsを用意する為にはSwiftPMを使わないといけない。それならgit submoduleで管理した方が良いのでは、と思えてしまう。
Avatar
たしかにそうですね。
Avatar
xcodeprojの生成時にHashable.hashValueに依存する何かがあって、ランダムハッシュシードによって毎回変化があるようになったとかかな
Avatar
たしかに4.2でhashの挙動変わったからそれが原因なのかも
Avatar
一応環境変数でランダムシードは無効化できるので、それでコマンド実行試すと分かるかも。
10:43 AM
SWIFT_DETERMINISTIC_HASHING=1
👀 2
Avatar
リポジトリにxcodeproj入れるのをやめた方が良い気が…
Avatar
リポジトリに入れないとCarthage対応できない😅
Avatar
それはまたちょっと話が違ってくると思う
Avatar
それでReactorKitとかはCarthage対応が切り捨てられてます
10:45 AM
いや今回のDIKitのケースはそういう話ですね (edited)
Avatar
Carthageって.xcworkspaceでもいける?
Avatar
Carthage対応のために用意するxcodeprojはCarthageのルールで設置されるディレクトリに依存物が入っているから
10:45 AM
SwiftPMでcheckoutする依存物のフォルダ名の謎の数列とはまた別では
Avatar
workspaceでOKです
10:46 AM
それとは別の話ですが、ランダムハッシュシードが
Avatar
SwiftPMのgenerate-xcodeprojで作られるxcodeprojと、CarthageでiOSとかで使えるようにするために設置するxcodeprojは、互換性が取れない
Avatar
xcworkspaceで行けるなら、SourceKittenみたいに手動でメンテナンスするのが良いと思う。
Avatar
うーん話が混線してしまった
Avatar
DIKitの場合、今リポジトリに入ってるxcodeprojではCarthageでビルド出来ないのでは。
Avatar
今までできてたのです
Avatar
その際、.build/checkoutsはどの様に用意してたのですか?
Avatar
ん、DIKit.framework自体(ランタイム用)には依存性はありません
Avatar
ああ、DIKitを使うDIGenKitが使うのですね。
10:52 AM
あれ?それで.build/checkoutsが無くてもCarthageでビルド出来ていたって事ならば、.build/checkouts以下のパスに再現性が無くても構わないという事になりそうな気が…
Avatar
はい、なのでそこが混線しているところで、checkoutsのパスの数列の件と、generate-xcodeprojの生成結果に毎回差分があるのは別の話だと思うのです。 (edited)
👀 2
Avatar
なるほど。
Avatar
ランダムハッシュシードがそれぞれに別々に関係しているのでは、と思っていたのが先の発言です (edited)
10:58 AM
SwiftPMのgenerate-xcodeprojで作られるxcodeprojと、CarthageでiOSとかで使えるようにするために設置するxcodeprojは、互換性が取れない
取れないケースもあるけど、ちょっとだけ手を入れると取れるケースもあるんですよね(それがDIKitのケース)
Avatar
DIKit自身に依存先が無いなら、いけそうですね。
Avatar
何をしてるかはDIKitのMakefileを見てもらうとよさそう
11:01 AM
Carthage/Checkoutsなどを突っ込むのと同じで.build/checkoutsもリポジトリに突っ込んでしまえば依存性あるケースでもいけるのかもしれない
11:02 AM
で、話を戻すと、generate-xcodeprojの生成結果が決定的にできるなら今のやり方でもいいし、そうでなければXcodeGenみたいな別ツール使うか、みたいな話なのでした
11:03 AM
もしくは普通に手でxcodeproj作って管理するか
Avatar
試してみましたが、.build/checkouts内のパスも変わるし、project.pbxproj内の要素の順番とかも変わりますね。
11:09 AM
生成されたxcodeprojからDIKit.framework以外の要素を手動で削除してしまえば良いのかも。
👀 1
Avatar
https://github.com/apple/swift-package-manager/blob/235aacc514cb81a6881364b0fedcb3dd083228f3/Sources/PackageGraph/PackageGraph.swift#L23-L33 この辺で Set 使っていてこの PackageGraph から諸々生成しているので、ランダムシードの影響受けるのは必至なのですが、手元で試した限り env SWIFT_DETERMINISTIC_HASHING=1 swift package generate-xcodeproj でも阻止できないので、やっかいですね。
The Package Manager for the Swift Programming Language - apple/swift-package-manager
👀 2
😢 1
Avatar
手元で SWIFT_DETERMINISTIC_HASHING 試したら name = "Products"; の箇所だけなぜか順番が変わるけど、そこ以外は安定してる "OBJ_162" = { isa = "PBXGroup"; children = ( "Yams::Yams::Product", "DIKit::dikitgen::Product", "Yams::CYaml::Product", "PathKit::PathKit::Product", "DIKit::DIGenKit::Product", "Stencil::Stencil::Product", "DIKit::DIGenKitTests::Product", "Spectre::Spectre::Product", "DIKit::DIKit::Product", "SWXMLHash::SWXMLHash::Product", "SourceKitten::SourceKittenFramework::Product" ); name = "Products"; path = ""; sourceTree = "BUILT_PRODUCTS_DIR"; };
12:31 PM
こんなコメントがあった https://github.com/apple/swift-package-manager/blob/ddfe6e23f3eaf3f79e003d872b6072a2686b4c88/Sources/Xcodeproj/XcodeProjectModel.swift#L52-L54 - there is no good way to control the ordering of the `Products` group in the main group; it needs to be added last in order to appear after the other references (edited)
The Package Manager for the Swift Programming Language - apple/swift-package-manager
Avatar
yutailang0119 9/19/2018 12:35 PM
たしかに env SWIFT_DETERMINISTIC_HASHING=1 swift package generate-xcodeproj で実行すると、hashは固定されるけど、根本的にだめな気がしてきた... (edited)
Avatar
norio_nomura 9/20/2018 3:46 AM
DIKitのdependenciesをsubmodule化したモノ作ってみた。 https://github.com/ishkawa/DIKit/compare/master...norio-nomura:update-xcodeproj
A statically typed dependency injector for Swift. Contribute to ishkawa/DIKit development by creating an account on GitHub.
👀 1
Avatar
norio_nomura 9/20/2018 3:53 AM
submodule管理はCarthageで。 (edited)
3:54 AM
generate-xcodeprojで生成したproject.pbxproj.build/checkouts/*Carthage/Checkouts/*へ書き換え。
3:55 AM
Swift 4.2で不要になったmodulemap削除。
3:56 AM
Package.swiftへの参照は、親グループの複数パターンに対応できない為にリンク切れになってるけど、ビルドに影響ないので放置。
3:57 AM
そんな感じ。
Avatar
omochimetaru 9/20/2018 3:57 AM
Carthageフロントエンド+git submoduleだ
Avatar
norio_nomura 9/20/2018 4:02 AM
CartfileではなくCartfile.privateを使うべきなのかも。
Avatar
そういえば昨日の @rintaro さんのやつ、 Package.swift 側で↓のようなアプローチは使えないかと思ったけど、 // swift-tools-version:4.2 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription var targets: [Target] = [ .target( name: "Foo", dependencies: []), .testTarget( name: "FooTests", dependencies: ["Foo"]), ] assert({ targets.append( .testTarget( name: "FooDebugTests", dependencies: ["Foo"]) ) return true }()) DEBUG が渡らないだけじゃなくて、 -c が Package.swift を debug/release のどちらで実行するかに影響を与えるわけではない( -c release でも debug っぽい)みたいでダメだった。
Avatar
そうですねー、Package.swift のロード(実行)のコマンドは https://github.com/apple/swift-package-manager/blob/106115d356f750223dbd4419c3f39f8fc2da66f7/Sources/PackageLoading/ManifestLoader.swift#L310-L329 この辺だと思っていて、そこでconfigurationを渡していないようなので。渡すようにしたPR出すのはありやなしや。
The Package Manager for the Swift Programming Language - apple/swift-package-manager
Avatar
Package.swift の実行に configuration が反映されれば色々できそうですが、一方で -c は Package.swift についてではないよなぁという気もしますね。それよりも DEBUG 等が Package.swift にも渡される方が良さそう?
Avatar
確かに最適化まではされる必要もないし、直接configurationが渡されるよりは、-c debugの時は-D DEBUGも指定、くらいが妥当そう
👍 1
Avatar
Kishikawa Katsumi 9/20/2018 5:43 AM
Package.swiftはSwiftコードだから分岐できるとかは全然いいと思うんですが、それをやり始めるとDSLとしてはけっこう大変になるので、私ならリジェクトしたいかも。
Avatar
omochimetaru 9/20/2018 5:45 AM
僕も動的な事は全部PackageDescription型のプロパティで表現できる範囲に済ませたい
5:46 AM
例えば、Target型に var disableWhenDebug: Bool があってスイッチできる、みたいな感じで。
Avatar
Swift PM 使って書いてるスクリプトで↓のエラーで困ってるんですが、 10.12 以降でだけ使えればいいんで、これをビルド時に簡潔に指定する方法ってありませんか? Xcode プロジェクト側ではなく、コマンドか Package.swift とかで。 error: 'iso8601' is only available on OS X 10.12 or newer public static let dateDecodingStrategy: JSONDecoder.DateDecodingStrategy = .iso8601 ↓でいちおうビルドできるんですが、もっと Swift PM 的に良い方法はないかなと。 swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12"
Avatar
norio_nomura 10/1/2018 9:36 AM
ソース内で if #available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *) { を使わずに?
Avatar
はい。それを使うと↑の dateDecodingStrategy にアクセスした箇所全部で分岐が必要になってしまうので・・・。
9:41 AM
10.12 以降のみの利用を想定しているので、コード上であまりがんばりたくない感じです。
Avatar
-Xswiftcでの指定しか僕も知らないですね……
Avatar
norio_nomura 10/1/2018 1:34 PM
extension JSONDecoder.DateDecodingStrategy { @available(OSX, obsoleted: 10.11) static var iso8601 = JSONDecoder.DateDecodingStrategy.formatted({ let formatter = DateFormatter() formatter.calendar = Calendar(identifier: .iso8601) formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" formatter.timeZone = TimeZone(secondsFromGMT: 0) return formatter }()) } とかやってみたけど、候補を探すときに@availableを考慮してくれなくてダメだった。 Compile Swift Module 'Foo' (1 sources) /Users/norio/github/Foo/Sources/Foo/Foo.swift:17:37: error: ambiguous use of 'iso8601' decoder.dateDecodingStrategy = .iso8601 ^ Foundation.JSONDecoder:7:14: note: found this candidate case iso8601 ^ /Users/norio/github/Foo/Sources/Foo/Foo.swift:5:16: note: found this candidate static var iso8601 = JSONDecoder.DateDecodingStrategy.formatted({ ^
😭 1
Avatar
norio_nomura 10/2/2018 4:24 AM
swift-DEVELOPMENT-SNAPSHOT-2018-10-01-aswift run --replが出来る様になりました。 https://github.com/apple/swift-package-manager/pull/1793
This adds a --repl option to swift run which will build the package and launch the Swift REPL. All reachable library modules will be accessible in the REPL. It works by generating a special dylib p...
4:25 AM
パッケージをビルドしてからインポートできる状態でSwift REPLが起動します。
Avatar
便利そうですね😀
Avatar
omochimetaru 10/2/2018 4:55 AM
おお良さそう
Avatar
Extensions are very easily leaked into the clients. Since Swift doesn't have the concept of private imports at this point, it is not safe to have public stdlib extensions as it can easily cause...
2:38 AM
これ、 .spm.shellEscaped 式にできそうだね
Avatar
Swift 4.2からswift test --parallel --xunit-output result.xmlとか出来る様になってたの知らなかった。 https://github.com/apple/swift-package-manager/commit/047df6464ab15e27ab19b9a8263caeaf32127065
This generates xUnit xml file when the option --xunit-output is specified with the parallel test runner. This is a very minimal implementation and is currently hidden from help. We should try to ge...
3:06 AM
--xunit-outputを使うには--parallelが必要。
3:13 AM
どうやら--xunit-outputは未完成の機能だから--helpには出てこないらしい。
Avatar
result.xmlが出せる嬉しさがよくわからないんですが、XcodeからSwiftPM経由でテストを実行してその結果をXcodeにGUIで返す、みたいな事ができるようになる?
Avatar
CircleCIやAzure Pipelinesとか、xUnitの出力をWebのUIに出せたりします。
3:24 AM
テスト結果表示をサポートしてるCIでxUnit対応はかなり多いはず。
3:26 AM
今はxcpretty -r junitとかで生成してるのが不要になる。
Avatar
あ〜なるほど、それは嬉しいですねえ
Avatar
質問なのですが、Swift PM って dylib とかを同梱する機能ってあるんでしょうか?
11:43 AM
新しい SwiftSyntax は lib_InternalSwiftSyntaxParser.dylib を要求するので、何らかの方法で同梱しないといけないはずなのですが、issue 検索しても native extension 的な話は出てこないんですよね。。。
Avatar
norio_nomura 3/5/2019 11:46 AM
バイナリを同梱する機能は無いと思います。
11:47 AM
パッケージのリポジトリに含めておいて、dlopenで動的にロードする事は頑張れば出来そうな気もしますが、試した事は無いです。
11:49 AM
あ、dlopenも無理かな。
Avatar
やっぱりそうですよね、今って Package.swift から linker や swiftc へオプション渡す記法も存在しなさそうだし、SwiftSyntax チームはどうするつもりなんだろう…
Avatar
norio_nomura 3/5/2019 11:49 AM
Toolchainへ同梱するのでは。
Avatar
あー、なるほど…
11:49 AM
その可能性は濃厚ですね。ありがとうございます。確かにおっしゃる通りです
11:50 AM
うーん、困ったな。。。
Avatar
norio_nomura 3/5/2019 11:54 AM
swift-DEVELOPMENT-SNAPSHOT-2019-03-04-aには含まれてるみたいですよ。
Avatar
おお、なるほど!
11:56 AM
あー、そういうことか。つまり native extension 使いたければ include path に自分で dylib 入れとけって話になるわけですね。。。
11:57 AM
そして公式のやつはビルトインされると。
11:59 AM
その bridge は SwiftPM へ同梱する感じですね。https://github.com/apple/swift-syntax/tree/master/Sources/_CSwiftSyntax
SwiftPM package for SwiftSyntax library. Contribute to apple/swift-syntax development by creating an account on GitHub.
11:59 AM
理解しました。
Avatar
SwiftPMからPOSIXモジュールを削除するPR https://github.com/apple/swift-package-manager/pull/2053
The POSIX module in SwiftPM was written before corelibs-foundation was mature enough. This module provided a great value but isn't good in the long term since we want SwiftPM to be as cross-pla...
Avatar
omochimetaru 3/25/2019 1:03 AM
いいですねえ
Avatar
The Package Manager for the Swift Programming Language - apple/swift-package-manager
2:47 PM
2:47 PM
Swift PM ってリリースされないんですっけ?
2:49 PM
master にも swift-5.0-branch にも PackageDescriptionV5.md がない? https://github.com/apple/swift-package-manager/tree/swift-5.0-branch/Documentation
The Package Manager for the Swift Programming Language - apple/swift-package-manager
2:51 PM
Swift 5 is now officially released!
Avatar
norio_nomura 3/26/2019 3:00 PM
内容は同じだけど、僕はこっちを見るかな。 https://apple.github.io/swift-evolution/#?version=5&search=Package
Avatar
なるほど、ありがとうございます🙏
Avatar
omochimetaru 5/8/2019 9:47 AM
SwiftPMのリソースサポートの進捗を調べた。 話してるスレッド https://forums.swift.org/t/swift-pm-bundles-and-resources/13981 によると、OSS FoundationにBundleサポートを実装すれば、SwiftPMでそれを取り扱えるようになる、という流れで、 Bundleの仕様書がここ https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/FHS%20Bundles.md#freestanding-bundles Bundleの実装が、2018年1月に出て https://github.com/apple/swift-corelibs-foundation/pull/1573 でも完了してなくて、 26日前に別PRのBundle実装が出てマージ待ち https://github.com/apple/swift-corelibs-foundation/pull/2093 SwiftPM側のリソースサポートの提案の下書きがコレ https://github.com/abertelrud/swift-evolution/blob/package-manager-resources/proposals/NNNN-package-manager-resources.md というわけで、ゆっくり進んでる事がわかった
Once Swift Foundation PR #1573 and #1570 are merged we will be able to use Bundle API on Linux with Freestanding bundles. This means that with the following structure: FooExecutable FooExecutable.resources/Info.plist FooExecutable.resources/FooResource.json libBarLibrary.so ...
The Foundation Project, providing core utilities, internationalization, and OS independence - apple/swift-corelibs-foundation
Implements Bundle(for:) by using dladdr() on the type descriptor of a class. For further discussion, see apple/swift#16964, which is a dependency of this patch. Resolves SR-953.
Adds support for finding the bundle path for implicitly loaded bundles (for which we only know the executable path). Unifies Windows and other platforms implementation. Enables Freestanding Bundles...
This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - abertelrud/swift-evolution
👀 2
9:54 AM
PR1573はBundle(for: class)で、Bundle実装自体は1570だけどcloseされて2093に引き継がれたんだ。 https://github.com/apple/swift-corelibs-foundation/pull/1570 Bundle(for: class)のためにtypedescriptorを取るランタイム関数がSwiftランタイムに追加されて、その結果のシンボルをdladdrにかけてdylibの名前を参照してる。
This enables finding Freestanding bundles directory from the executable path as specified on the FHS Bundles doc. Unifies Windows implementation with other platforms.
Avatar
omochimetaru 5/8/2019 10:04 AM
BundleとはいうもののUNIX流儀に合わせて/shareとか/libに中身をバラバラに展開する考えっぽい。面白い。
Avatar
omochimetaru 5/23/2019 3:51 AM
SwiftPMのC Target、特定のファイルの置き方をしていたかどうかによって、2種類の取扱があるっぽい。
3:52 AM
おそらく Sources/${target}/include/${target}.h が置いてあり、かつ、 modulemapが置いてない ときに限って
3:52 AM
DEFINES_MODULES = YES になるモードになって
3:52 AM
どっちかの条件でも満たしていないと、 DEFINES_MODULES = NO になるっぽい。
5:04 AM
この辺か。
Avatar
swift package generate-xcodeproj の挙動ならば、僕が提案したモノですね。
Avatar
おお、元はどういう挙動だったんですか?
12:27 PM
modulemapを置いた時点で構造の自由度がframeworkの構造を超えてxcodeから使えなくなるので、今の挙動自体はこれで正しいと思います
12:28 PM
本当はxcodeに依存ターゲットからheader search pathを継承するような機能が欲しいけど。。
Avatar
以前は無条件にmodule.modulemapを生成して、それ経由でリンクしていたはずです。 https://github.com/apple/swift-package-manager/pull/1406
This was rewritten #955 for master. This PR increases the portability of generated Xcode project by reducing the use of module.modulemap which absolute path contains. If clang module has umbrella...
12:38 PM
あ、マージされたのはこっちか。 https://github.com/apple/swift-package-manager/pull/1602
…present This makes the C language frameworks actual frameworks when umbrealla header is present in the target. It should be possible to embed these targets in other Xcode projects using subproject...
Avatar
なるほど!
12:39 PM
SwiftPMが作るやつはフルパスになってしまって、生成物を共有できないから
12:40 PM
依存元がSwiftPM以外の場合に不便なことになるので
12:40 PM
いける場合はxcodeのdefine moduleになるのは助かる
Avatar
norio_nomura 6/4/2019 12:23 AM
Today we’re excited to announce that we’ll be adding support for Swift packages to GitHub Package Registry. Swift packages make it easy to share your libraries and source code across your projects and with the Swift community.
12:26 AM
GitHub Package RegistryがSwift Packageをサポートすると聞いて、BetaにSign Upしておいた。 https://github.com/features/package-registry/
With GitHub Package Registry you can safely publish and consume packages within your organization or with the entire world.
Avatar
swiftのサンプルはまだ載ってないですね。 spmの場合はリポジトリURLをそのまま指定してましたがそのへんがどうなるんだろう……
Avatar
SwiftPMってstatic linkだけでしたっけ?今までちょっとしたツールのmac向けコンソールアプリでしか使ったことなかったし、そのあたり全く気にしてませんでした。
Avatar
omochimetaru 6/5/2019 3:49 AM
The Package Manager for the Swift Programming Language - apple/swift-package-manager
3:50 AM
.library(name: "PaperDynamic", type: .dynamic, targets: ["Paper"]),
3:50 AM
指定はできるみたいです
Avatar
あ、そうなんですね。
Avatar
Leave this parameter unspecified to let to let the Swift Package Manager choose between static or dynamic linking (recommended). オススメはSwiftPMに任せる、なんですね。
👍 2
Avatar
omochimetaru 6/16/2019 7:30 AM
There's already a proposal draft by @abertelrud which was also mentioned in this WWDC session. They specifically asked for community feedback on the proposal and implied that Apple would do any work needed to update the Xcode integration once SwiftPM implemented support for r...
🙂 4
7:30 AM
7月以降にリソースプロポーザル出そう by Ankit
Avatar
Linux上にて $ swift test --generate-linuxmain warning: can't discover tests on Linux; please use this option on macOS instead #if os(macOS)でmac専用のテストを書いている場合、mac上でgenerate-linuxmainするとそれらも含まれてしまうので微妙……
Avatar
omochimetaru 7/3/2019 5:30 AM
なるほどw
5:30 AM
#ifをテストケースの内側に書くと良いのでは
5:30 AM
違うプラットフォームでは空のテストにする。
Avatar
そうですね。それがいいかと思ってました。
5:31 AM
複数のテストをまとめてくくっている場合がちょっと面倒ですが
Avatar
omochimetaru 7/3/2019 5:31 AM
あとは、generatelinuxmainが次で不要になりそうだから、それまで待つか
Avatar
test discoveryでしたっけ
Avatar
omochimetaru 7/3/2019 5:32 AM
うん
Avatar
Package Descriptionのドキュメントページがあるの知らなかった。いつもgithub.comへ見に行ってた… https://docs.swift.org/package-manager/PackageDescription/PackageDescription.html
Avatar
僕も!w そこにあったのか。
Avatar
https://swift.org/package-manager/ でドキュメントを探すとGitHubへ誘導されるし。 (edited)
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
Avatar
norio_nomura 7/18/2019 1:08 AM
まだ出来たばかりだったらしい。 https://twitter.com/aciidb0mb3r/status/1151658511446597632
@norio_nomura @daniel_duan Yep, it’s new. I need to add its link in other pages.
7:11 AM
SwiftPMのターゲット名のパッケージ名にSPMってプレフィックスを付けるそうな。
7:11 AM
結局そうなるんかい・・・
Avatar
norio_nomura 7/18/2019 9:57 AM
ネームスペースとはなんだったのか…
Avatar
omochimetaru 7/19/2019 3:25 AM
SwiftPMをコマンドラインから使った場合は実行ファイルに Load command 20 cmd LC_RPATH cmdsize 120 path /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx (offset 12)
3:25 AM
これが設定されるけど
3:26 AM
Xcode11からPackage.swiftを開いてビルドした場合は Load command 20 cmd LC_RPATH cmdsize 32 path /usr/lib/swift (offset 12) Load command 21 cmd LC_RPATH cmdsize 40 path @executable_path/../lib (offset 12)
3:27 AM
こうなっていて、通るパスが違う。というか、xcode11のツールチェインを見るようになってねえ。
3:27 AM
それで、 #swift-syntax に書いたけど、SwiftSyntaxが使えない。
Avatar
norio_nomura 7/19/2019 4:01 AM
DYLD_LIBRARY_PATHをチェックして、rpathへ設定するパッチ。 @@ -0,0 +1,35 @@ diff --git a/Package.swift b/Package.swift index 8234442cbb68248f8c541e8af979c538c72df0a6..abf133e63098c7bf46cb28bb971e21afae5e462b 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:4.2 +// swift-tools-version:5.0 //===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// import PackageDescription +import Foundation let package = Package( name: "swift-format", @@ -64,7 +65,15 @@ let package = Package( "SwiftFormatConfiguration", "SwiftFormatCore", "SwiftSyntax", - ] + ], + linkerSettings: { () -> [LinkerSetting] in + if let DYLD_LIBRARY_PATH = ProcessInfo.processInfo.environment["DYLD_LIBRARY_PATH"]? + .components(separatedBy: ":") { + let flags = DYLD_LIBRARY_PATH.flatMap { ["-rpath", $0] } + return [.unsafeFlags(flags)] + } + return [] + }() ), .testTarget( name: "SwiftFormatRulesTests",
Avatar
norio_nomura 7/19/2019 4:10 AM
Package Manager関連が余分なので、フィルタとかすべき。
Avatar
omochimetaru 7/19/2019 4:21 AM
おお、linkerSettingsでrpathを注入できるのか!
4:22 AM
実行時のことだけ考えてたけど、バイナリ生成時にそのへんに手を入れればいいのか、ありがとうございます。
Avatar
SwiftPM の dependencies で from: ではなく .branch("...") でレポジトリを指定してあるとして、branch のコミットが進んだときに「そのブランチの最新コミットを fetch し直す」ってできるんでしょうか?( .buildPackage.resolved を消して swift build し直せばできるのですが…) (edited)
Avatar
omochimetaru 7/20/2019 3:50 PM
swift package updateかな?
Avatar
おぉ、そんな便利なものが!
Avatar
xcodeproj でやってるビルドは全て swift build に適切なオプションをつければ実行できるものなのでしょうか?(例えば Bridging-Header の指定とか、C++ の Standard Library の指定とか) この辺のことの仕様ってどこかにまとまっていたりしますか? (edited)
Avatar
omochimetaru 7/20/2019 4:23 PM
全ては無理だと思います bridging headerはspmに無いと思います ドキュメントは https://swift.org/package-manager/ https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md ぐらい 詳細はソース見る必要がありそう
Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.
The Package Manager for the Swift Programming Language - apple/swift-package-manager
Avatar
なるほど!bridging-header がないってことは、Obj-C や C++ を含むコードは swift build できないってことですかね? (edited)
4:25 PM
Xcode がどういうコマンドでビルドしてるかってのを見ることはできるんでしょうか?
Avatar
omochimetaru 7/20/2019 4:27 PM
swiftpmはC系のビルドにも対応してますが、 Swiftとはターゲットを分ける必要があります xcodeのコマンドはビルドログのところで全部見れます
4:28 PM
ブリッジングヘッダーは一つのターゲットの中でCとSwiftを混ぜる仕組みなので。
Avatar
なるほど…🤔 (原理的にはできるけど設定が大変という理解であってますか?) (edited)
Avatar
むむぅ、そもそも project の中に swift 以外のファイルが入ってると generate-xcodeproj もできないんですね…
5:33 PM
SwiftPM で管理してる純 Swift のライブラリを、Obj-C や C++ 入りのプロジェクトから SwiftPM 経由で fetch してくるってのはできないんですかね…
Avatar
純 Swift 部分と、Obj-C / C++ 部分で target を分けて、前者から後者をライブラリ経由で呼び出せばいけるんですかね? (edited)
Avatar
やりたいのはこういうことです: ・A : Swift 製 ライブラリ (Swift PM 管理、自作) ・B : C++ 製 ライブラリ (3rd Party 製) ・C : A, B を使う Swift 製プログラム (B の利用は Obj-C++ wrapper を経由) ・C を Swift PM 管理にしたい、特に A の変更を簡単にアップデートできるようにしたい (edited)
Avatar
Kishikawa Katsumi 7/20/2019 6:20 PM
CもライブラリでCを使うアプリケーションが別途あるんですか
6:21 PM
いやCはExcutableか。
Avatar
Kishikawa Katsumi 7/20/2019 6:30 PM
要するにObjC++のライブラリとリンクするパッケージが作れたらいいんですよね。
Avatar
Kishikawa Katsumi 7/20/2019 7:12 PM
. ├── Package.swift └── Sources ├── App │   └── main.swift ├── ClibB │   ├── Greeting.cpp │   └── include │   └── Greeting.hpp └── ClibBWrapper ├── HelloCpp.mm └── include └── HelloCpp.h 1つのPackage.swiftでやると、 ^ C++のコードをObjC++でラップしたモジュールを使うSwiftのパッケージ構成はこんな感じで、 Package.swiftは // swift-tools-version:4.0 import PackageDescription let package = Package( name: "Hello", targets: [.target(name: "App", dependencies:["ClibBWrapper"]), .target(name: "ClibBWrapper", dependencies:["ClibB"]), .target(name: "ClibB"),] ) こう。
😍 1
7:13 PM
これを基本形としてあとはこれの応用だと思います。
Avatar
ちょうどぼくも先週、同じようなことを模索してました。
1:23 AM
ObjCとSwift混在のアプリ(App)のうち、一部のSwiftをSwiftPMのパッケージ(Foo)に切り出そうとしてたんですが、切り出すとAppのObjCからFooを呼び出せなくなって。呼び出せないというか、Fooに切り出した分がApp-Swift.hに出てこなくなるからヘッダがなくなってしまって。
1:28 AM
今のところ、Foo側で、手動で swiftc を -emit-objc-header 付きで呼び出してFooの分のヘッダを作成して、そのヘッダを参照できるだけのCモジュールもFoo側に作って、AppではそのCモジュールを参照するようにしたんですが。
1:33 AM
パッケージの構成はこんな感じで ├── Package.swift └── Sources ├── Foo │ ├── Foo1.swift │ ├── Foo2.swift │ └── FooN.swift └── CFoo ├── Foo.m └── include └── Foo-swift.h
1:34 AM
Package.swiftがこんな感じです。 // swift-tools-version:5.0 import PackageDescription let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo"), .target(name: "CFoo", dependencies: ["Foo"]) ] ) (edited)
1:36 AM
Foo.mの中身は空っぽで、Foo-Swift.hが -emit-objc-header で作ったヘッダファイル。 App側でCFooを参照すれば、ObjCでも、 @import CFoo; だけでヘッダの参照ができるようになりました。 (edited)
1:40 AM
ただ、Foo側のコードを変更した時に Foo-Swift.h を更新するのがすごく面倒で… 😟
Avatar
むむ…僕の問題は @Kishikawa Katsumi さんの書いてるやり方でできれば良いと思うのですが、 @hironytic さんはそれではできないということを書かれてるのでしょうか? (edited)
2:04 AM
ObjC → Swift の呼び出しできない、というところが問題?(僕の問題と逆のケースですかね?) (edited)
Avatar
そうですね。ぼくのは ObjC → Swift の呼び出しができずに困ってました。それで、とりあえず呼び出しはできるようになったんですが、FooのSwiftファイルを変更したときにObjC向けヘッダーを手動で更新しないといけないところが運用上の課題、という現状です。
Avatar
ふむふむ、理解しました。
Avatar
たぶん岸川さんのやりかたでうまくいくんじゃないかと思ってます。
😆 1
Avatar
norio_nomura 7/21/2019 3:56 AM
FooのSwiftファイルを変更したときにObjC向けヘッダーを手動で更新しないといけな
// swift-tools-version:5.0 import PackageDescription let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo", swiftSettings: [ .unsafeFlags(["-emit-objc-header-path", "Sources/CFoo/include/Foo-swift.h"]) ]), .target(name: "CFoo", dependencies: ["Foo"]) ] ) とか。
(edited)
😮 2
Avatar
omochimetaru 7/21/2019 8:57 AM
@norio_nomura それcool!!
Avatar
@norio_nomura おー!明日やってみます
10:58 AM
あ、でも、unsafeFlagsを使ってるパッケージって、他から利用しようとしたらエラーになった覚えが。
Avatar
あー、確かにそう書かれてた。 /// As some build flags could be exploited for unsupported or malicious /// behavior, the use of unsafe flags make the products containing this /// target ineligible to be used by other packages. 知りませんでした…
😧 1
😭 1
Avatar
@Kishikawa Katsumi さんのやり方で generate-xcodeproj して(ビルド設定を追加した上で)実行できました! そこで以下のビルド設定も Package.swift の中に入れられると嬉しいのですが、可能でしょうか?
  • Frameworks and Libraries に
  • Accelerate.framework と,
  • /usr/local/lib 下の libgivaro, libgmp, liblinbox.dylib を追加
  • header search paths に /usr/local/include を追加
  • library search path に /usr/local/lib を追加
cxxSettingsheaderSearchPath/usr/local/include を入れてみたのですが、絶対パスは指定できないようで… Package.swift は以下の通りです: import PackageDescription let package = Package( name: "ClosedRegion", dependencies: [ ... ], targets: [ .target( name: "LinBoxWrapper", // これが C++ ライブラリの wrapper dependencies: [] ), .target( name: "ClosedRegion", // これがプログラム本体 dependencies: ["...", "LinBoxWrapper"]) ], cxxLanguageStandard: .cxx11 ) C++ のライブラリは含まれておらず、ビルド済みのものが /usr/local/lib 下にある状況です。これが Xcode を立ち上げる必要なく swift run だけで走るようになるとさらに嬉しいです。
(edited)
Avatar
こちらがレポジトリです。 https://github.com/taketo1024/ClosedRegion
Contribute to taketo1024/ClosedRegion development by creating an account on GitHub.
Avatar
(昔は otherCompilerOptions: ["-I", "/usr/local/include"]) とか出来たっぽい…?
Avatar
.target( name: "LinBoxWrapper", dependencies: [], cxxSettings: [ .unsafeFlags(["-I", "/usr/local/include"]) ], linkerSettings: [ .linkedFramework("Accelerate"), .unsafeFlags(["-L", "/usr/local/lib"]), .linkedLibrary("linbox"), .linkedLibrary("gmp"), .linkedLibrary("givaro") ] ), これで出来てそう! (edited)
Avatar
swift run でも実行できました!😆😆😆
🎉 2
Avatar
皆さん色々と教えて下さりありがとうございます 🙏
Avatar
unsafeFlagsを使ったやつ、unsafeFlagsを使ってるFooそのものじゃなくて、Fooに依存してるCFooの方を利用しようとしたら、MergeSwiftModuleのフェーズでエラーになりました(なお、"App"はiOSアプリで、Xcode 11 beta 4で試しています)
2:48 AM
<unknown>:0: error: error opening '(...ProjectのDerivedDataのパス...)/SourcePackages/checkouts/Foo/Sources/CFoo/include/Foo-Swift.h' for output: Operation not permitted
2:49 AM
なお、Fooそのものの方を利用しようとしたら(ObjCからは呼び出せないことは覚悟の上で試しにやってみたら)、サクッと次のような感じのエラーになりました。 error: The package product 'Foo' cannot be used as a dependency of this target because it uses unsafe build flags. (in target 'App' from project 'App')
2:51 AM
でもまあFoo-Swift.hを更新するためだけの、パッケージ外に公開しないターゲットを作っておけば、Fooの開発中にそちらのターゲットをビルドすることで自動的にFoo-Swift.hを作れそうなので、運用面はだいぶ改善される気がします。まだそちらは試してませんけど。
Avatar
試してみようとしたけど、それはダメでした。FooDevelopというターゲットを作って、path引数でSources/Fooを指定してunsafeFlagsをつけようとしたけど、ソースファイルがoverlapしてると言われた 😩
Avatar
norio_nomura 7/22/2019 3:29 AM
ソースファイルがoverlapしてる
そんなチェックも入ってるのか。
3:33 AM
Foo-Swift.hを更新するためだけの、パッケージ外に公開しないターゲット
別のターゲットではなく、環境変数でunsafeFlagsが有効になる様にするとか。
💡 1
Avatar
omochimetaru 7/22/2019 3:36 AM
ObjC → Swift はSwiftPMだと微妙なんですねえ
Avatar
SwiftPMでObjCのパッケージも作れそうだから、そもそもFooをObjCで書けば罠は踏まないかもしれない(いやだ)
Avatar
norio_nomura 7/22/2019 3:46 AM
呼ばれるSwift側が単純なfuncとかならそれほど問題にならないけど、型を使うとかだと面倒ですね。
Avatar
@norio_nomura 環境変数で unsafeFlags を有効にする方法ってあります?やってみようとしたら見つけられなかったので。
Avatar
norio_nomura 7/22/2019 3:50 AM
こんな感じ。 // swift-tools-version:5.0 import PackageDescription import Foundation let package = Package( name: "Foo", products: [ .library(name: "Foo", targets: ["Foo"]), .library(name: "CFoo", targets: ["CFoo"]) ], targets: [ .target(name: "Foo", swiftSettings: { ProcessInfo.processInfo.environment["UPDATE_SWIFT_HEADER"] != nil ? [.unsafeFlags(["-emit-objc-header-path", "Sources/CFoo/include/Foo-swift.h"])] : [] }()), .target(name: "CFoo", dependencies: ["Foo"]) ] ) (edited)
Avatar
おお!Swiftだから、そこでそんな風に書けるんですね!思いつきませんでした!
Avatar
omochimetaru 7/22/2019 3:56 AM
SwiftPM的にはCターゲットがSwiftターゲットへ依存してる事まで理解しててコマンドは全部抑えてるんだから、SwiftPMに機能追加すればスッキリ解決しそうだな。
Avatar
norio_nomura 7/22/2019 3:56 AM
上記コードは動作確認していません。クロージャにしなくてもいける気もします。
3:57 AM
PackageDescriptionモジュールにもっと簡単に環境変数へアクセス出来る仕組みがあっても良い気もします。 (edited)
Avatar
環境変数のやつ、クロージャーは要らないですね。それと、環境変数が定義されていないときの [] はempty list not supportedって言われるので nil に変更。これで動くことは動くようです 🙂
11:35 PM
ただし、Xcode (11以降) で開発するつもりなので、そうするといつどこで定義した環境変数が生きてくるのかよくわからず 😟
11:41 PM
export UPDATE_SWIFT_HEADER=1;open /Applications/Xcode_11_Beta_4.app でXcodeを起動するのはあんまりだ(これでいちおう動くことは確認しましたが) でも、CIで使うにはいい方法だなと思いました。
Avatar
いや、CIでやるなら、Package.swiftはいじらずに、swift buildに -Xswiftc -emit-objc-header-path -Xswiftc Sources/CFoo/include/Foo-swift.h を付けて呼べばいいだけのような気がしてきました 😅 (edited)
12:04 AM
↑と思ったけど、依存パッケージのビルドにも -emit-objc-header-path が使われてしまうのでダメです。
Avatar
--enable-test-discoveryオプションつけるとLinux用のテストファイルを自動生成する?機能が使えるらしい。良さそう https://github.com/apple/swift-package-manager/pull/2174/
This is a WIP PR for implementing test discovery on linux using indexing data. The basic idea is to leverage the IndexStore library to get the test methods and then generate a LinuxMain.swift file ...
Avatar
norio_nomura 7/25/2019 3:38 AM
それ結局SourceKitを使わずにIndexStodeDBで実装してるのですよね。
Avatar
そうみたいですね。まだ全部読めてないけどIndexStore使ってますね。
Avatar
omochimetaru 7/25/2019 3:45 AM
IndexStore学ぶとリッチなインテグレーションツールが作れるんかね
Avatar
norio_nomura 7/25/2019 3:49 AM
コンパイラが生成する、ソースコード中のシンボルの位置情報を扱うDBだったかな?SourceKitみたいにリッチな情報は得られないけど、テストメソッドかどうかのフラグは含まれてるから、