插件捆綁

目錄

  1. 入門

    1. 插件基礎(chǔ)
    2. 您的第一個(gè)插件
    3. 開發(fā)環(huán)境
    4. 調(diào)試
    5. Action API
    6. 發(fā)布插件
  2. 高級(jí)

    1. 插件捆綁
    2. 插件咆爽,腳本和命令
    3. 插件位置
    4. 更多關(guān)于CocoaScript
    5. SketchTool

插件是一個(gè)或多個(gè)腳本的集合刨仑。每個(gè)腳本定義一個(gè)或多個(gè)以某種方式擴(kuò)展Sketch的命令怯邪。

在磁盤上,插件是具有.sketchplugin文件擴(kuò)展名的文件夾盹靴,包含文件和子文件夾玛歌。

嚴(yán)格來說乌逐,插件實(shí)際上是一個(gè)OS X軟件包,被安排為OS X軟件包膨桥。

包是Finder向用戶呈現(xiàn)的任何目錄蛮浑,就好像它是單個(gè)文件一樣(您可以使用Finder中的“ 顯示包內(nèi)容”命令查看內(nèi)部)。

一個(gè)包是一個(gè)具有標(biāo)準(zhǔn)化層次結(jié)構(gòu)的目錄只嚣,該目錄包含可執(zhí)行代碼和該代碼使用的資源陵吸。

Sketch插件不允許本機(jī)編譯代碼,但我們確實(shí)使用標(biāo)準(zhǔn)包布局(例如介牙,資源位于包中的資源/文件夾中)壮虫,特定于插件的文件位于Sketch /目錄中。

插件捆綁文件夾結(jié)構(gòu)

Bundles包含一個(gè)manifest.json文件,一個(gè)或多個(gè).cocoascript文件(包含用CocoaScript或JavaScript編寫的腳本)囚似,它們實(shí)現(xiàn)Plugins菜單中顯示的命令以及任意數(shù)量的共享庫腳本和資源文件剩拢。

這是一個(gè)例子:

mrwalker.sketchplugin
  Contents/
    Sketch/
      manifest.json
      shared.js
      Select Circles.cocoascript
      Select Rectangles.cocoascript
    Resources/
      Screenshot.png
      Icon.png

最關(guān)鍵的文件是manifest.json文件,它告訴Sketch其他所有內(nèi)容饶唤。

表現(xiàn)

清單是一個(gè)JSON文件徐伐,其中包含有關(guān)插件,其命令和資源的元數(shù)據(jù)募狂。

它描述了諸如全名办素,描述和作者姓名等內(nèi)容。它列出了插件定義的任何命令的名稱祸穷,并告訴Sketch調(diào)用相應(yīng)的菜單項(xiàng)以及將它們放入哪個(gè)菜單性穿。

這是一個(gè)例子:

{
  "name": "Select Shapes",
  "description": "Plugins to select and deselect shapes",
  "author": "Joe Bloggs",
  "homepage": "https://github.com/example/sketchplugins",
  "version": "1.0",
  "identifier": "com.example.sketch.shape-plugins",
  "appcast": "https://excellent.sketchplugin.com/excellent-plugin-appcast.xml",
  "compatibleVersion": "3",
  "bundleVersion": 1,
  "commands": [
    {
      "name": "All",
      "identifier": "all",
      "shortcut": "ctrl shift a",
      "script": "shared.js",
      "handler": "selectAll"
    },
    {
      "name": "Circles",
      "identifier": "circles",
      "script": "Select Circles.cocoascript"
    },
    {
      "name": "Rectangles",
      "identifier": "rectangles",
      "script": "Select Rectangles.cocoascript"
    }
  ],
  "menu": {
    "items": ["all", "circles", "rectangles"]
  }
}

這個(gè)插件被稱為“選擇形狀”。它定義了三個(gè)命令“全部”雷滚,“圓”和“矩形”需曾,它們將被放置在“選擇形狀”菜單中。

這個(gè)插件可以通過Sketch進(jìn)行更新祈远。Sketch將在指定的位置下載文件appcast并使用它來確定是否有更新呆万。

將此文件進(jìn)一步解壓縮,以下是支持的密鑰及其用途:

name

這個(gè)插件的名稱车份。默認(rèn)情況下谋减,它將用作插件菜單命令出現(xiàn)的子菜單的名稱。

description

描述此插件的命令(或命令)所做的字符串扫沼。

author

指定插件作者的字符串出爹。

authorEmail

指定如何通過電子郵件與插件作者聯(lián)系的可選字符串。

homagepa

可選字符串充甚,指定用戶在線資源以查找更多信息或?yàn)椴寮峁┓答仭?/p>

version

例如以政,一個(gè)字符串,指定插件的語義版本伴找。1.0``1.1.1

identifier

一個(gè)字符串盈蛮,指定插件的唯一標(biāo)識(shí)符。

例如技矮,強(qiáng)烈建議使用反向域語法com.example.sketch.shape-plugins抖誉。

Sketch在內(nèi)部使用該字符串來跟蹤插件,為其存儲(chǔ)設(shè)置等衰倦。

appcast

指定appcast文件的URL的字符串袒炉。appcast文件包含有關(guān)插件更新的信息,例如可用更新的版本以及可從中下載更新的位置樊零。Sketch下載此文件以確定是否有可用的插件更新我磁。

compatibleVersionmaxCompatibleVersion

一個(gè)字符串孽文,指定版本素描在其中作者已測試了插件,例如3夺艰,3.1芋哭,3.2.2

目前(Sketch3.4)這是一個(gè)可選鍵郁副,但我們可以在插件頁面的某個(gè)時(shí)刻將它用作過濾選項(xiàng)减牺。

它在內(nèi)部使用BCCompareVersions函數(shù)來分割字符串.,然后比較每個(gè)組件的整數(shù)值存谎。

bundleVersion

元數(shù)據(jù)包的布局版本拔疚。如果排除,則假定值為1既荚。

這只是我們面向未來的機(jī)制稚失。如果將來我們看到bundleVersion> 1的插件,我們就會(huì)知道我們可以以不同的方式處理元數(shù)據(jù)中的其他值固以。

現(xiàn)在可以忽略它墩虹。

disableCocoaScriptPreprocessor

這是一個(gè)高級(jí)設(shè)置嘱巾,默認(rèn)為false憨琳。設(shè)置true為時(shí),它將禁用CocoaScript自己的預(yù)處理器旬昭。這樣篙螟,您就可以使用諸如browserify或ES6模塊語法的構(gòu)建系統(tǒng)來開發(fā)您的插件。

將此選項(xiàng)設(shè)置為true執(zhí)行以下操作:

  • 禁用@import支持问拘,您必須手動(dòng)處理您的導(dǎo)入
  • 禁用括號(hào)語法(即[obj msg:]:)遍略,則只能使用點(diǎn)語法

commands

插件定義的一組命令。

數(shù)組中的每個(gè)項(xiàng)目都是一個(gè)字典骤坐,用于指定命令的名稱绪杏,快捷方式和其他屬性。有關(guān)更多詳細(xì)信息纽绍,請參閱插件命令蕾久。

menu

描述此插件中命令的菜單布局的字典。

請參閱插件菜單以獲取有關(guān)該詞典內(nèi)容的更多詳細(xì)信息拌夏,以及如何構(gòu)建每個(gè)插件的菜單僧著。

插件命令

插件定義一個(gè)或多個(gè)用戶執(zhí)行的命令。

清單中的命令數(shù)組描述了這些障簿。數(shù)組中的每個(gè)條目都是一個(gè)字典盹愚,具有以下屬性:

name

命令的顯示名稱。該值在插件菜單中使用站故。

identifier

一個(gè)字符串皆怕,用于指定插件捆綁中命令的唯一標(biāo)識(shí)符。這用于一致地將命令映射到操作,而不考慮命令名稱的變化愈腾。

shortcut

一個(gè)可選的字符串朗兵,指定了該命令的默認(rèn)快捷鍵,例如:ctrl t顶滩,cmd t余掖,ctrl shift t

script

Sketch實(shí)現(xiàn)此命令的腳本的插件包文件夾內(nèi)的相對路徑礁鲁。

handler

用腳本調(diào)用此命令的函數(shù)的名稱盐欺。該函數(shù)必須采用單個(gè)context參數(shù),這是一個(gè)帶有當(dāng)前文檔和選擇項(xiàng)等鍵的字典仅醇。如果未指定冗美,則該命令預(yù)期為onRun

var onRun = function (context) {
  var doc = context.document;
  var selection = context.selection;
  …
}

插件菜單

當(dāng)它加載插件時(shí),Sketch為它創(chuàng)建一個(gè)菜單析二,并使用清單文件中“菜單”字典中的信息填充該菜單粉洼。

該字典可以包含以下鍵。

title

指定用于子菜單的標(biāo)題的字符串叶摄。

items

這是一個(gè)列出要包含在菜單中的項(xiàng)目的數(shù)組属韧。

它可以包含兩種類型的項(xiàng)目:

  • 一個(gè)給出命令標(biāo)識(shí)符的字符串
  • 描述子菜單的字典(包含“標(biāo)題”和“項(xiàng)目”)

isRoot

默認(rèn)情況下,此字典中列出的菜單項(xiàng)將顯示在菜單中蛤吓,其名稱由標(biāo)題鍵指定宵喂。

如果指定了isRoot鍵,并且值為true会傲,則這些項(xiàng)目將插入到插件菜單的根級(jí)別锅棕,而不是插入到子文件夾中。在這種情況下淌山,標(biāo)題密鑰將被忽略裸燎。

這個(gè)鍵在子菜單中被忽略。

菜單示例

這是一個(gè)例子泼疑。它在名為“My Plugin Menu”的菜單中定義了三個(gè)命令德绿。菜單的前兩項(xiàng)對應(yīng)于插件的兩個(gè)命令,但第三項(xiàng)是名為“My Plugin Submenu”的子菜單王浴。這個(gè)子菜單中有一個(gè)項(xiàng)目(插件命令的第三個(gè)項(xiàng)目):

{
  "menu": {
    "title": "My Plugin Menu",
    "items": [
      "command1-identifier",
      "command2-identifier",
      {
        "title": "My Plugin Submenu",
        "items": ["command3-identifier"]
      }
    ]
  }
}

處理程序

插件命令由處理程序?qū)崿F(xiàn)脆炎。

這些只是生活在.cocoascriptPlugin包中的一個(gè)文件中的JavaScript函數(shù),它包含一個(gè)包含某個(gè)上下文的參數(shù)氓辣。

這里有一個(gè)簡單的例子:

var doMyCommand = function(context) {
  context.document.currentPage().deselectAllLayers()
}

在清單文件中秒裕,您可以指定一個(gè)描述插件定義的每個(gè)命令的字典。

在這本詞典中钞啸,腳本處理程序鍵告訴Sketch要查看哪個(gè)腳本文件几蜻,以及要運(yùn)行哪個(gè)處理程序喇潘。

您可以自由地將每個(gè)命令實(shí)現(xiàn)放入其自己的腳本文件中,或?qū)⑺鼈內(nèi)糠湃雴蝹€(gè)文件中梭稚。

您必須為每個(gè)命令指定腳本密鑰颖低。

如果將每個(gè)命令放入其自己的腳本文件中,則可以省略處理程序密鑰弧烤。在這種情況下忱屑,Sketch將默認(rèn)調(diào)用onRun處理程序。

如果將多個(gè)命令處理程序放入同一個(gè)腳本文件中暇昂,則需要為每個(gè)腳本文件使用處理程序密鑰莺戒,因?yàn)樗鼈儾荒苋渴褂?code>onRun處理程序!

原文:https://developer.sketchapp.com/guides/plugin-bundles/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末急波,一起剝皮案震驚了整個(gè)濱河市从铲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澄暮,老刑警劉巖名段,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泣懊,居然都是意外死亡伸辟,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門嗅定,熙熙樓的掌柜王于貴愁眉苦臉地迎上來自娩,“玉大人用踩,你說我怎么就攤上這事渠退。” “怎么了脐彩?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵碎乃,是天一觀的道長。 經(jīng)常有香客問我惠奸,道長梅誓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任佛南,我火速辦了婚禮梗掰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗅回。我一直安慰自己及穗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布绵载。 她就那樣靜靜地躺著埂陆,像睡著了一般苛白。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焚虱,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天购裙,我揣著相機(jī)與錄音,去河邊找鬼鹃栽。 笑死躏率,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的民鼓。 我是一名探鬼主播禾锤,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摹察!你這毒婦竟也來了恩掷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤供嚎,失蹤者是張志新(化名)和其女友劉穎黄娘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體克滴,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逼争,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劝赔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片誓焦。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖着帽,靈堂內(nèi)的尸體忽然破棺而出杂伟,到底是詐尸還是另有隱情,我是刑警寧澤仍翰,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布赫粥,位于F島的核電站,受9級(jí)特大地震影響予借,放射性物質(zhì)發(fā)生泄漏越平。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一灵迫、第九天 我趴在偏房一處隱蔽的房頂上張望秦叛。 院中可真熱鬧,春花似錦瀑粥、人聲如沸挣跋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浆劲。三九已至嫌术,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牌借,已是汗流浹背度气。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膨报,地道東北人磷籍。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像现柠,于是被迫代替她去往敵國和親院领。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355