Script Debuggerを操作して、オープン中のScriptのうちのいずれかから、選択してScriptからリンクしているFrameworkやライブラリが指定のScriptバンドル内に存在しているかどうかチェックするAppleScriptです。
AppleScript appletの納品時にライブラリやFrameworkをすべてバンドル内に入れておいたはずなのに、納品先の環境でFrameworkやライブラリが入っていないエラーに直面したことは、実はけっこうあります。とくにFrameworkです。
つまり、バンドルに収めたFrameworkやライブラリがリンクされていれば問題ないものの、~/Library/Frameworksや~/Library/Script Librariesフォルダ内のファイルが指し示されている場合には、他の環境に持って行ったときに実行できません。
その割に、どのFrameworkがバンドル外ファイルにリンクされているのかといったチェックを(Apple純正のスクリプトエディタでは)明示的に行う手段がなく、一時的に開発環境内の当該Frameworkを削除してアプリケーション書き出しして様子を見るといったチェック作業を行っていました。
AppleScriptのバンドル内にFrameworkを突っ込む機能がScript Debugger上に用意されていないため手作業で行っており、たまーに突っ込むフォルダの階層を間違えてしまうんですね(涙)。
自分のことながら、この作業自体がひたすら間抜けだったので、プログラムでチェックだけでも行えるようにしてみたものがこのAppleScriptです。
本Scriptは1つのScriptをそのままチェックするだけのものです。本来は、当該Scriptに含まれるScript Libraryを再帰でオープンしてチェックすべきなんでしょう。
Script Debuggerにこの機能が用意されているということは、メーカーのLate Night Softwareでもいろいろハマったんだと思いますが、メニューなどのGUI要素がついていない理由がよくわかりません。Shaneにはアプリ書き出し時にFrameworkのバンドル内組み込みを行う方向で要望は出しています。現場的には必須の機能です。
AppleScript名:sd checker.scptd |
— – Created by: Takaaki Naganoya – Created on: 2019/06/30 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions tell application "Script Debugger" set dList to name of every document set dRes to choose from list dList with prompt "Choose Script to check linked files (framework/script libraries)" if dRes = false then return set dName to contents of item 1 of dRes tell document dName set myFile to path –Framework Check set uList to used framework files set fList to {} repeat with i in uList set j to POSIX path of i if (j does not start with myFile) and (j does not start with "/System/Library/Frameworks/") then set the end of fList to j end if end repeat –Script Library Check set libList to used script library files set sList to {} repeat with i in sList set j to POSIX path of i if j does not start with myFile then set the end of sList to POSIX path of i end if end repeat (* –Scripting Additions Check (Omitted) set sdList to used scripting addition files set dList to {} repeat with i in dList set j to POSIX path of i if j does not start with myFile then set the end of dList to POSIX path of i end if end repeat *) end tell end tell set resList to {fList, sList} set res2List to FlattenList(resList) of me set res3List to cleanUp1DList(res2List, {""}) of me if res3List = {} then display dialog "Lib/Framework link check OK" else set aLen to length of res3List set tmpStr to retDelimedText(res3List, return) of me display dialog (aLen as string) & " Lib/Framework exists out of the bundle." & return & tmpStr end if –次元数上限なしの多次元配列を1次元配列にフラット化 By Paul Berkowitz on FlattenList(aList) set oldDelims to AppleScript’s text item delimiters set AppleScript’s text item delimiters to {"????"} set aString to aList as text set aList to text items of aString set AppleScript’s text item delimiters to oldDelims return aList end FlattenList on cleanUp1DList(aList as list, cleanUpItems as list) set bList to {} repeat with i in aList set j to contents of i if j is not in cleanUpItems then set the end of bList to j end if end repeat return bList end cleanUp1DList on retDelimedText(aList, aDelim) set aText to "" set curDelim to AppleScript’s text item delimiters set AppleScript’s text item delimiters to aDelim set aText to aList as text set AppleScript’s text item delimiters to curDelim return aText end retDelimedText |
Manabu Yajima says:
こんばんは。
掲載のスクリプトをいつも参考にさせてもらってます。
分からないことで少し質問があるのですが、Frameworkはバンドルに内包できるのでしょうか?
できるとすれば、バンドル内にどのような階層でファイルを置き、スクリプトにどのように書けばリンクできるのでしょうか。
分からず苦戦してます。教えていただけたら幸いです。
環境:macOS Mojave 10.14.5、純正のスクリプトエディタ
Takaaki Naganoya says:
もしもお手元に拙著「最新事情がわかる AppleScript 10大最新技術」がありましたら、100ページにある図をご参照ください。
https://piyomarusoft.booth.pm/items/301502
アプレットのバンドル(と仮定)内にFrameworkのファイルを入れる場合の内包先は、/Contents/Frameworks です。スクリプト内にはフレームワークのパスを明記することはできないので、書き方は変わりません。useコマンドでFramework名称を指定するだけです。
Manabu Yajima says:
ありがとうございます。おかげ様で無事内包することができました。
今後の為にもと、書籍も購入させていただきました。