PS:目前利用前端技術開發跨平臺App很火爆,最火的當屬使用cordova框架開發App,另外最近很火的前端開發框架ionic訪問原生的能力也是來自于cordova(對cordova進行了封裝)。插件是它們的核心所在,無論我們要使用ionic還是直接使用cordova去開發一個App,都會用到框架提供的插件或自定義插件,所以掌握Plugin.xml的編寫還是很重要滴~。
plugin.xml文件作用
plugin.xml文件定義插件所需的結構和設置,它通過幾個元素來提供有關插件的詳細信息。
cordova Plugin.xml 官網
現在開始詳細說一下這些元素(標簽)~~~
頂級元素plugin
該plugin元素是插件清單的頂級元素。
屬性(類型) | 描述 |
---|---|
xmlns(string) | 必需的,插件命名空間http://apache.org/cordova/ns/plugins/1.0。如果文檔包含來自其他命名空間的XML,例如AndroidManifest.xml在Android的情況下要添加到文件中的標記,那么這些命名空間也應該包含在元素中。 |
id(string) | 必需的,插件的npm樣式標識符。 |
version(string) | 必需的, 插件的版本號。支持Semver語法。 |
例:
<plugin xmlns="http://apache.org/cordova/ns/plugins/1.0"
xmlns:android="http://schemas.android.com/apk/res/android"
id="my-plugin-id"
version="1.0.2">
engines and engine
plugin元素的子元素<engines>指定此插件支持的基于Apache Cordova的框架的版本。對于目標項目不滿足引擎約束的任何插件,CLI將使用非零代碼進行中止。如果不指定了標記,則CLI會嘗試盲目地安裝到指定的cordova項目目錄中。
注意:在Cordova 6.1.0+中,指定平臺,插件和CLI依賴項的推薦位置在插件的
package.json
中。有關 更多信息,請參閱指定Cordova依賴項。
屬性(類型) | 描述 |
---|---|
name(string) | Required, 引擎名稱。以下是支持的默認引擎:cordova; cordova-plugman;cordova-android; cordova-ios; cordova-windows; cordova-osx; windows-os; android-sdk (返回安裝的最高Android api級別); windows-sdk (返回本機Windows SDK版本); apple-xcode (返回xcode版本); apple-ios (返回安裝的最高iOS版本); apple-osx (返回OSX版本)。除默認框架外,您還可以指定自定義框架。 |
version(string) | Required,您的框架必須具有的版本才能安裝。支持Semver語法。 |
scriptSrc(string) | *僅適用于自定義框架 *, Required ,此腳本文件告訴plugman自定義框架的版本。理想情況下,此文件應位于插件目錄的頂級目錄中。 |
platform(string) | 僅適用于自定義框架 Required ,您的框架支持的平臺。您可以使用通配符*來表示支持所有平臺,使用管道字符指定多個,如`android。 |
例如:
<engines>
<engine name="cordova-android" version="=1.8.0" />
</engines>
引擎元素還可以使用“>”,“> =”等指定模糊匹配以避免重復,并在更新基礎平臺時減少維護。
<engines>
<engine name="cordova-android" version=">=1.8.0" />
</engines>
該<engine>標簽默認支持所有的已經存在的主要的cordova平臺。指定cordova引擎標記意味著任何平臺上的所有Cordova版本都必須滿足引擎版本屬性。您還可以列出特定平臺及其版本,以覆蓋籠統的cordova引擎:
<engines>
<engine name="cordova" version=">=1.7.0" />
<engine name="cordova-android" version=">=1.8.0" />
<engine name="cordova-ios" version=">=1.7.1" />
</engines>
自定義框架的例子:
<engines>
<engine name="my_custom_framework" version="1.0.0" platform="android" scriptSrc="path_to_my_custom_framework_version"/>
<engine name="another_framework" version=">0.2.0" platform="ios|android" scriptSrc="path_to_another_framework_version"/>
<engine name="even_more_framework" version=">=2.2.0" platform="*" scriptSrc="path_to_even_more_framework_version"/>
</engines>
name
該name元素用于指定插件的名稱。此元素(尚未)處理本地化。
例如:
<name>Foo</name>
description
該description元素用于指定插件的描述。此元素(尚未)處理本地化。
例如:
<description>Foo plugin description</description>
author
author元素的內容包含插件作者的名稱。
例如:
<author>Foo plugin author</author>
keywords
keywords元素的內容包含逗號分隔的關鍵字以描述插件。
例子:
<keywords>foo,bar</keywords>
license(許可、執照)
此元素用于指定插件的許可證。
例如:
<license>Apache 2.0 License</license>
asset
此元素用于列出要復制到Cordova應用程序www目錄中的文件或目錄。任何嵌套在<platform>元素中的<asset>元素都指定特定于平臺的web資源。
屬性(類型) | 描述 |
---|---|
src(string) | Required,相對于plugin.xml文檔,文件或目錄位于插件包中的位置。如果指定的src位置不存在文件,CLI將停止并撤消安裝過程,發出有關沖突的通知,并使用非零代碼退出。 |
target(string) | Required,文件或目錄應位于Cordova應用程序中相對于www目錄的位置。如果目標位置已存在文件,CLI將停止并撤消安裝過程,發出有關沖突的通知,并以非零代碼退出。 |
例子:
<!-- a single file, to be copied in the root directory -->
<asset src="www/foo.js" target="foo.js" />
<!-- a directory, also to be copied in the root directory -->
<asset src="www/foo" target="foo" />
資源也可以指定到子目錄。這將在www目錄中創建js/experimental目錄,除非已存在,并復制該new-foo.js文件并將其重命名為foo.js。
<asset src="www/new-foo.js" target="js/experimental/foo.js" />
js-module
大多數插件都包含一個或多個JavaScript文件。每個<js-module>標記對應一個JavaScript文件,并阻止插件的使用者必須為每個文件添加<script>標記。不要使用cordova.define包裝文件,因為它是自動添加的。該模塊包含在一個閉包中,帶有模塊,導出,以及要求在范圍內,就像普通的AMD模塊一樣。嵌套在<platform>元素中的<js-module>元素聲明特定平臺綁定的JavaScript模塊。
屬性(類型) | 描述 |
---|---|
src(string) | Required,引用插件目錄中相對于plugin.xml文件的文件。如果src未解析為現有文件,CLI將停止并撤消安裝,發出問題通知,并以非零代碼退出。 |
name(string) | Required,提供模塊名稱的最后一部分。它通常可以是你喜歡的任何東西,只有你想在你的JavaScript代碼中使用cordova.require導入插件的其他部分才有意義。一個<js-module>中的模塊名稱<js-module>是您的插件的id。 |
例如:
使用下面的示例安裝插件時,將socket.js復制到www/plugins/my-plugin-id/socket.js并添加為條目www/cordova_plugins.js。在加載時,代碼cordova.js使用XHR讀取每個文件并將<script>標記注入HTML。
<js-module src="socket.js" name="Socket">
</js-module>
同樣對于此示例,如果插件ID為chrome-socket,則模塊名稱將為chrome-socket.Socket。
clobbers(覆蓋~個人理解)
<js-module>允許元素內使用。用于指定window插入module.exports的對象下的命名空間。你可以擁有任意多的<clobbers>,相應的window上創建的對象將不可用。
屬性(類型) | 描述 |
---|---|
target(string) | 插入module.exports的命名空間。 |
例:
<js-module src="socket.js" name="Socket">
<clobbers target="chrome.socket" />
</js-module>
這里module.exports作為window.chrome.socket被插入到window對象中。
merges
<js-module>允許元素內使用。用來指定在哪里module.exports獲取與任何現有的價值合并window對象的命名空間。如果已經存在,模塊的版本取代原來的。你可以有很多的merges只要你喜歡。創建在window上的任何對象不可用。
| 屬性(類型) | 描述 |
| --- | --- |
| target(string) | module.exports合并到的命名空間。 |
例:
<js-module src="socket.js" name="Socket">
<merges target="chrome.socket" />
</js-module>
這里module.exports與任何現有值合并在一起window.chrome.socket。
runs
<js-module>允許元素內使用。它意味著您的代碼應該使用cordova.require,但不能安裝在window對象上。這在初始化模塊,附加事件處理程序或其他方面很有用。您最多只能有一個<runs/>標簽。需要注意的是,包括一個<runs/>帶有<clobbers/>或者<merges/>是多余的,因為它們也cordova.require你的模塊。
例如:
<js-module src="socket.js" name="Socket">
<runs/>
</js-module>
dependency
該<dependency>標簽允許你指定在其當前插件依賴其他插件。插件由其唯一的npm id或github url引用。
屬性(類型) | 描述 |
---|---|
id(string) | 提供插件的ID。 |
url(string) | 插件的URL。這應該引用一個git存儲庫,CLI試圖克隆它。 |
commit(string) | 這是git通過git checkout以下方式引用:分支或標記名稱(例如master,0.3.1),或提交哈希(例如975ddb228af811dd8bb37ed1dfd092a3d05295f9)。 |
subdir(string) | 指定目標插件依賴項作為git存儲庫的子目錄存在。這很有用,因為它允許存儲庫包含幾個相關的插件,每個插件都單獨指定。如果你設置url一個的<dependency>標簽".",并提供一個subdir,依賴插件是從同一個本地或遠程的Git倉庫作為指定父插件安裝<dependency>標簽。請注意,subdir始終指定相對于git存儲庫根目錄的路徑,而不是父插件。即使您使用本地路徑直接安裝插件,也是如此.CLI找到git存儲庫的根目錄,然后從那里找到另一個插件。 |
version(string) | 該插件的版本取決于。支持Semver語法。 |
例:
<dependency id="cordova-plugin-someplugin" url="https://github.com/myuser/someplugin" commit="428931ada3891801" subdir="some/path/here" />
<dependency id="cordova-plugin-someplugin" version="1.0.1">
platform
標識具有關聯原生代碼或需要修改其配置文件的平臺。使用此規范的工具可以識別支持的平臺并將代碼安裝到Cordova項目中。沒有<platform>標簽的插件被假定為僅僅是JavaScript,因此可以安裝在任何和所有平臺上。
屬性(類型) | 描述 |
---|---|
name(string) | Required, 允許值:ios,android,windows,browser,osx 標識支持的平臺,將元素的子項與該平臺相關聯。 |
例如:
<platform name="android">
<!-- android-specific elements -->
</platform>
source-file
標識應安裝到項目中的可執行源代碼。
屬性(類型) | 描述 |
---|---|
src(string) | Required, 位置相對于plugin.xml文件。如果找不到src文件,CLI將停止并撤消安裝,發出有關問題的通知,并以非零代碼退出。 |
target-dir(string) | Required, 允許值:ios,android,windows,browser,osx 標識支持的平臺,將元素的子項與該平臺相關聯。 |
framework(boolean)蘋果平臺 | 默認值:false |
如果設置為true,則還將指定的文件作為框架添加到項目中。 | |
compiler-flags(string) 蘋果平臺 | 如果設置,則為特定源文件指定編譯器標志。 |
例子:
<!-- android -->
<source-file src="src/android/Foo.java" target-dir="src/com/alunny/foo" />
<!-- ios -->
<source-file src="src/ios/CDVFoo.m" />
<source-file src="src/ios/someLib.a" framework="true" />
<source-file src="src/ios/someLib.a" compiler-flags="-fno-objc-arc" />
header-file
這類似于<source-file>元素,但專門針對iOS和Android等平臺,用于區分源文件,頭文件和資源。Windows不支持此功能。
屬性(類型) | 描述 |
---|---|
src(string) | Required, 位置相對于plugin.xml文件。如果找不到src文件,CLI將停止并撤消安裝,發出有關問題的通知,并以非零代碼退出。 |
target-dir(string) | 應該復制文件的目錄,相對于Cordova項目的根目錄。 |
例:
<header-file src="CDVFoo.h" />
resource-file
這類似于<source-file>元素,但專門用于區分源文件,頭文件和資源的iOS和Android等平臺。
屬性(類型) | 描述 |
---|---|
src(string) | Required, 位置相對于plugin.xml文件。如果找不到src文件,CLI將停止并撤消安裝,發出有關問題的通知,并以非零代碼退出。 |
target(string) | 你的將要被復制的目錄中的文件路徑。 |
arch(string) windows平臺 | 允許值:x86,x64或ARM。指示僅在為指定體系結構構建時才包含該文件。 |
device-target windows平臺 | 設備對象 允許值:( win或windows),phone或all。指示僅在為指定的目標設備類型構建時才包含該文件。 |
versions windows平臺 | 指示僅在為與指定版本字符串匹配的版本構建時才應包含該文件。值可以是任何有效的節點語義版本范圍字符串。 |
reference windows平臺 | 指示應從src引用該文件,而不是將其復制到目標目標。該文件將顯示在Visual Studio中,文件名由target指定,但是將指向相應的src,具體取決于體系結構。 |
例子:
For Android:
<resource-file src="FooPluginStrings.xml" target="res/values/FooPluginStrings.xml" />
For Windows:
<resource-file src="src/windows/win81/MobServices.pri" target="win81\MobServices.pri" device-target="windows" versions="8.1" arch="x64"/>
<!-- Example of referencing -->
<resource-file src="x86/foo.dll" target="foo.dll" arch="x86" reference="true" />
<resource-file src="x64/foo.dll" target="foo.dll" arch="x64" reference="true" />
注意:target應使用反斜杠以避免在Visual Studio中DEP2100部署錯誤。
config-file
標識要修改的基于XML的配置文件,即:該文檔中應該被修改的位置,以及應修改的內容。已使用此元素測試修改的兩種文件類型是xml和plist文件。該config-file元素僅允許您將新子項附加到XML文檔樹。子項是要插入目標文檔的XML literals。
屬性(類型) | 描述 |
---|---|
target(string) | 要修改的文件以及相對于Cordova項目根目錄的路徑。如果指定的文件不存在,該工具將忽略配置更改并繼續安裝。target可以包含wildcard(*)元素。在這種情況下,CLI遞歸搜索項目目錄結構并使用第一個匹配項。在iOS上,配置文件相對于項目目錄root的位置未知,因此指定config.xml解析為的目標cordova-ios-project/MyAppName/config.xml。 |
after(string) | 接受兄弟姐妹的優先列表之后,添加 XML 片段。這是有用的在需要指定像XML元素的嚴格排序的文件中比如:this。 |
device-target(string) | windows。 允許值:win,phone,all。適用于在影meta-name package.appxmanifest時,此屬性指示僅在為指定的目標設備類型構建時才應修改該文件。 |
versions (string) | windows。 適用于在影meta-name package.appxmanifest時,此屬性表示只應針對與指定版本字符串匹配的版本,更改特定Windows版本的應用程序清單。值可以是任何有效的節點語義版本范圍的字符串。 |
例如:
For XML(Android等):
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<activity android:name="com.foo.Foo" android:label="@string/app_name">
<intent-filter>
</intent-filter>
</activity>
</config-file>
For plist(iOS):
<config-file target="*-Info.plist" parent="CFBundleURLTypes">
<array>
<dict>
<key>PackageName</key>
<string>$PACKAGE_NAME</string>
</dict>
</array>
</config-file>
For windows-specific attributes:
<config-file target="package.appxmanifest" parent="/Package/Capabilities" versions="<8.1.0">
<Capability Name="picturesLibrary" />
<DeviceCapability Name="webcam" />
</config-file>
<config-file target="package.appxmanifest" parent="/Package/Capabilities" versions=">=8.1.0" device-target="phone">
<DeviceCapability Name="webcam" />
</config-file>
上面的示例將設置8.1之前的平臺(特別是Windows 8)以要求webcam設備功能和picturesLibrary常規功能,并僅將webcam設備功能應用于為Windows Phone構建的Windows 8.1項目。Windows桌面8.1系統未經修改。
plugins-plist
指定要附加到iOS Cordova項目中AppInfo.plist 文件的鍵和值。這已經過時,因為它僅適用于cordova-ios 2.2.0及更低版本。將使用<config-file>標簽用于較新版本的Cordova。
lib-file
類似source, resource, and header files,但特別適用于使用用戶生成的庫的BlackBerry 10等平臺。對于Windows平臺,在生成的Windows項目文件中該<lib-file>元素允許包含an <SDKReference>。
屬性(類型) | 描述 |
---|---|
src(string) | Required, 位置相對于plugin.xml文件。如果找不到src文件,CLI將停止并撤消安裝,發出有關問題的通知,并以非零代碼退出。對于Windows,它指示要包含的SDK的名稱(將用作Include生成<SDKReference>元素的屬性的值)。 |
arch(string) | 真機或者simulator,構建已經被bulid 過的.so文件。對于Windows,它表示<SDKReference>僅包含在編譯特定的包時。支持的值是x86,x64或ARM。 |
device-target(string) | windows。 允許值:win,phone,all。它表示<SDKReference>僅包含在編譯特定目標設備的包時。 |
versions (string) | windows。 它表示<SDKReference>僅包含在編譯特定版本的包時。值可以是任何有效的節點語義版本范圍的字符串。 |
例如:
<lib-file src="src/BlackBerry10/native/device/libfoo.so" arch="device" />
<lib-file src="src/BlackBerry10/native/simulator/libfoo.so" arch="simulator" />
For Windows:
<lib-file src="Microsoft.WinJS.2.0, Version=1.0" arch="x86" />
<lib-file src="Microsoft.WinJS.2.0, Version=1.0" versions=">=8.1" />
<lib-file src="Microsoft.WinJS.2.0, Version=1.0" target="phone" />
<lib-file src="Microsoft.WinJS.2.0, Version=1.0" target="win" versions="8.0" arch="x86" />
framework
標識插件所依賴的框架(通常是OS /平臺的一部分)。
屬性(類型) | 描述 |
---|---|
src(string) | Required, 位置相對于plugin.xml文件。如果找不到src文件,CLI將停止并撤消安裝,發出有關問題的通知,并以非零代碼退出。對于Windows,它指示要包含的SDK的名稱(將用作Include生成<SDKReference>元素的屬性的值)。 |
src(string) | Required,系統框架的名稱或被包含的作為插件的一部分的系統框架的相對路徑。 |
custom(boolean) | 指示框架是否包含在插件文件中。 |
weak(boolean) | Default: false , 指示框架是否應該弱鏈接。 |
type(string) | Default: .; 設置包含要添加引用的子項目的目錄的相對路徑。默認值“.”表示應用程序項目。 |
parent(string) | 指示要添加的框架類型。 |
arch(string) | windows 。允許值:x86,x64或ARM。指僅在編譯特定包時才包含框架。 |
device-target(string) | windows。 允許值:( win或windows),phone或all。指僅在編譯特定設備的包時才包含框架。 |
versions (string) | windows。 它表示框架僅包含在編譯特定版本的包時。值可以是任何有效的節點語義版本范圍的字符串。 |
target-dir (string) | 表示框架中的應該被復制子目錄。實際上,在不同的芯片架構或設備目標中包含不同的框架版本但具有相同名稱時,這一點非常重要。這允許您為每個框架版本指定不同的子文件夾,以便它們不會相互重疊。 |
例如:
For iOS:
<framework src="libsqlite3.dylib" />
<framework src="social.framework" weak="true" />
<framework src="relative/path/to/my.framework" custom="true" />
在Android上(截至cordova-android@4.0.0),框架標記用于包含Maven依賴項,或包含捆綁的庫項目。
<!-- Depend on latest version of GCM from play services -->
<framework src="com.google.android.gms:play-services-gcm:+" />
<!-- Depend on v21 of appcompat-v7 support library -->
<framework src="com.android.support:appcompat-v7:21+" />
<!-- Depend on library project included in plugin -->
<framework src="relative/path/FeedbackLib" custom="true" />
Framework還可用于將自定義.gradle文件包含在主項目的.gradle文件中:
<framework src="relative/path/rules.gradle" custom="true" type="gradleReference" />
在Windows下使用,custom='true'并且type='projectReference'將添加項目引用,將被添加到這些cordova項目的編譯+鏈接步驟。這基本上是當前“自定義”框架可以針對多個體系結構的唯一方式,因為它們顯式構建為依賴通過cordova應用程序的引用。
<framework src="path/to/project/LibProj.csproj" custom="true" type="projectReference"/>
使用這些Windows特定屬性的示例:
<framework src="src/windows/example.dll" arch="x64" />
<framework src="src/windows/example.dll" versions=">=8.0" />
<framework src="src/windows/example.vcxproj" type="projectReference" target="win" />
<framework src="src/windows/example.vcxproj" type="projectReference" target="all" versions="8.1" arch="x86" />
<framework src="src/windows/example.dll" target-dir="bin/x64" arch="x64" custom="true"/>
info
向用戶提供的其他信息。當您需要無法輕松實現或超出CLI范圍的額外步驟時,這非常有用。CLI安裝插件時會打印出此標記的內容。
例:
<info>
You need to install __Google Play Services__ from the `Android Extras` section using the Android SDK manager (run `android`).
You need to add the following line to the `local.properties`:
android.library.reference.1=PATH_TO_ANDROID_SDK/sdk/extras/google/google_play_services/libproject/google-play-services_lib
</info>
hook
表示您在發生特定操作時將由Cordova調用的自定義腳本(例如,在添加插件或調用平臺準備邏輯之后)。當您需要擴展默認的Cordova功能時,這非常有用。有關詳細信息,請參閱 Hooks Guide。
例:
<hook type="after_plugin_install" src="scripts/afterPluginInstall.js" />
uses-permission
在某些情況下,插件可能需要根據目標應用程序進行配置更改。例如,要在Android上注冊C2DM,其包ID為my-app-id的應用程序將需要一個權限,比如:
<uses-permission android:name="my-app-id.permission.C2D_MESSAGE"/>
在這種情況下,從plugin.xml文件中插入的內容未提前知道,變量可以用美元符號表示,后跟一系列大寫字母,數字或下劃線。對于上面的示例,該plugin.xml文件將包含此標記:
<uses-permission android:name="$PACKAGE_NAME.permission.C2D_MESSAGE"/>
CLI使用指定值替換變量引用,如果未找到則替換空字符串。可以檢測變量引用的值(在這種情況下,從AndroidManifest.xml文件中)或由工具的用戶指定; 確切的過程取決于特定的工具。
Plugman可以請求用戶指定插件的必需變量。例如,可以將C2M和Google Maps的API密鑰指定為命令行參數:
plugman --platform android --project /path/to/project --plugin name|git-url|path --variable API_KEY=!@CFATGWE%^WGSFDGSDFW$%^#$%YTHGsdfhsfhyer56734
應保留某些變量名稱,例如$PACKAGE_NAME。這是包的反向域樣式唯一標識符,對應CFBundleIdentifier于iOS上或package屬性的頂級manifest元素在AndroidManifest.xml文件中。
preference
如上一節所示,有時插件可能要求用戶指定其變量的值。要使這些變量成為必需項,<platform>標記需要包含<preference>標記。CLI檢查是否傳入了這些必需的首選項。如果沒有,它應該警告用戶如何傳入變量并使用非零代碼退出。
屬性(類型) | 描述 |
---|---|
name(string) | Required,變量的名稱。 |
default(string) | 變量的默認值。如果存在,將使用其值,并且如果用戶未輸入任何值,則不會發出錯誤。 |
例如:
<preference name="API_KEY" default="default-value" />
*好啦,到這里終于把Plugin.xml文件給解析了一遍,希望對讀者有幫助,下一節我們將在ionic項目中創建一個cordova自定義插件。