2 votes

Exécuter le shell script de Package.swift

J'essaye d'inclure une chaîne de version codée en dur générée par git describe dans un CLI que j'écris en Swift.

L'idée est d'avoir un shell script qui exécute git describe et l'écrit comme une constante globale dans un fichier appelé Version.swift que je peux ensuite référencer à partir de mon outil.

Je ne veux pas avoir à penser à exécuter ce script avant chaque build cependant ou à construire le projet via un autre shell script. L'idéal serait de continuer à utiliser swift build et faire en sorte que Swift lui-même invoque ledit script lorsqu'il compile et évalue Package.swift .

J'ai donc inclus les éléments suivants dans le manifeste de mon paquet.

import Foundation

let task = Process()
task.launchPath = "./"
task.arguments = ["update_version.sh"]
task.launch()
task.waitUntilExit()

Alors que l'importation de Foundation et l'initialisation de la tâche semblent fonctionner correctement, le lancement de la tâche se bloque et produit la trace de pile suivante.

error: manifest parse error(s):
2017-07-28 15:07:43.711 swift[39828:16163314] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't posix_spawn: error 13'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff9be232cb __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00007fffb0c5d48d objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff9bea1c3d +[NSException raise:format:] + 205
    3   Foundation                          0x00007fff9d84c54e -[NSConcreteTask launchWithDictionary:] + 3134
    4   ???                                 0x0000000109ccb1c3 0x0 + 4459377091
    5   swift                               0x00000001045fe84f _ZN4llvm5MCJIT11runFunctionEPNS_8FunctionENS_8ArrayRefINS_12GenericValueEEE + 655
    6   swift                               0x0000000104604ab3 _ZN4llvm15ExecutionEngine17runFunctionAsMainEPNS_8FunctionERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEEPKPKc + 707
    7   swift                               0x00000001039f4512 _ZL14performCompileRN5swift16CompilerInstanceERNS_18CompilerInvocationEN4llvm8ArrayRefIPKcEERiPNS_16FrontendObserverEPNS_20UnifiedStatsReporterE + 22802
    8   swift                               0x00000001039ed394 _ZN5swift15performFrontendEN4llvm8ArrayRefIPKcEES3_PvPNS_16FrontendObserverE + 7332
    9   swift                               0x00000001039a2ad8 main + 12248
    10  libdyld.dylib                       0x00007fffb1542235 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
0  swift                    0x0000000107073eaa PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x00000001070732e6 SignalHandler(int) + 662
2  libsystem_platform.dylib 0x00007fffb1751b3a _sigtramp + 26
3  libsystem_platform.dylib 0x00000003ba442240 _sigtramp + 147785504
4  libsystem_c.dylib        0x00007fffb15d6420 abort + 129
5  libc++abi.dylib          0x00007fffb012c84a __cxa_bad_cast + 0
6  libc++abi.dylib          0x00007fffb0151c4f default_unexpected_handler() + 0
7  libobjc.A.dylib          0x00007fffb0c5f6fe _objc_terminate() + 103
8  libc++abi.dylib          0x00007fffb014ed69 std::__terminate(void (*)()) + 8
9  libc++abi.dylib          0x00007fffb014e9f2 __cxa_rethrow + 99
10 libobjc.A.dylib          0x00007fffb0c5d94a objc_exception_rethrow + 40
11 Foundation               0x00007fff9d84c884 -[NSConcreteTask launchWithDictionary:] + 3956
12 Foundation               0x0000000109ccb1c3 -[NSConcreteTask launchWithDictionary:] + 1816656051
13 swift                    0x00000001045fe84f llvm::MCJIT::runFunction(llvm::Function*, llvm::ArrayRef<llvm::GenericValue>) + 655
14 swift                    0x0000000104604ab3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, char const* const*) + 707
15 swift                    0x00000001039f4512 performCompile(swift::CompilerInstance&, swift::CompilerInvocation&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*, swift::UnifiedStatsReporter*) + 22802
16 swift                    0x00000001039ed394 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 7332
17 swift                    0x00000001039a2ad8 main + 12248
18 libdyld.dylib            0x00007fffb1542235 start + 1
Stack dump:
0.  Program arguments: /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret /Users/kilian/dev/apodidae/Package.swift -target x86_64-apple-macosx10.10 -enable-objc-interop -sdk /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk -I /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/pm/4 -swift-version 4 -module-name Package -lPackageDescription -- -fileno 5

Le contenu de update_version.sh est le suivant

echo "// THIS FILE IS AUTO-GENERATED\npublic let VERSION = \""$(git describe)"\"" > Sources/target/Version.swift

Qu'est-ce que je pourrais faire ici pour que ça marche ? Est-ce que cela a à voir avec le manifeste du paquet exécuté dans une sandbox ? Et si oui, quelles sont les options dont je dispose pour accomplir ce que j'essaie de faire ? Si c'est possible, j'aimerais vraiment pouvoir simplement exécuter swift build et avoir le reste juste travailler .

0voto

user3441734 Points 7396

L'exception n'a RIEN à voir avec votre approche, le système l'a soulevée parce que votre launchPath n'est PAS un chemin de lancement valide :-). Vous devez être ABSOLUMENT sûr de la validité de votre launchPath, sinon l'exécution sera interrompue par une exception non capturée. Pour une solution, voir comment le résoudre

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X