assets-hotupdate-setting.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. const utils = Editor.require('packages://build-helper/core/libs/utils.js');
  2. let ListItem;
  3. (() => {
  4. 'use strict';
  5. return function init ( panel ) {
  6. let viewEL = panel.$.view;
  7. let tmpl = 'packages://build-helper/panel/assets-hotupdate-setting.tmpl';
  8. Editor.import(tmpl).then(content => {
  9. viewEL.innerHTML = content;
  10. let assetsHotUpdate = `assetsHotUpdate`;
  11. let update = panel.getSettingItem(assetsHotUpdate) || {};
  12. // 热更开关
  13. let enableCheckboxEle = viewEL.querySelector('#enableCheckbox');
  14. enableCheckboxEle.value = update.enable;
  15. enableCheckboxEle.addEventListener('change', (event) => {
  16. update.enable = event.target.value;
  17. panel.setSettingItem(assetsHotUpdate, update);
  18. });
  19. // 热更远程URL
  20. let remoteUrlEle = viewEL.querySelector('#remoteUrl');
  21. remoteUrlEle.value = update.remoteUrl;
  22. remoteUrlEle.addEventListener('confirm', e => {
  23. if (!utils.isURL(event.target.value)) {
  24. Editor.error('请输入正确的URL');
  25. return;
  26. }
  27. update.remoteUrl = event.target.value;
  28. panel.setSettingItem(assetsHotUpdate, update);
  29. });
  30. // 支持平台
  31. let platformEle = viewEL.querySelector('#platform');
  32. platformEle.value = update.platform;
  33. platformEle.addEventListener('confirm', e => {
  34. update.platform = event.target.value;
  35. panel.setSettingItem(assetsHotUpdate, update);
  36. });
  37. // 检查manifest文件
  38. function checkManifest (relative) {
  39. let root = Editor.Project.path + '/' + relative;
  40. let assetsdb = 'db://';
  41. let assetsIdx = root.indexOf('assets');
  42. if (assetsIdx !== -1) {
  43. assetsdb += root.substr(assetsIdx, root.length);
  44. } else {
  45. assetsdb += '/assets';
  46. }
  47. let host = remoteUrlEle.value || 'http://localhost';
  48. let projectManifestPath = root + '/project.manifest';
  49. utils.accessPath(projectManifestPath, (err)=> {
  50. if (err && err.code === 'ENOENT') {
  51. let assetsdbProjectManifestPath = assetsdb + '/project.manifest';
  52. utils.createProjectManifestAssets(assetsdbProjectManifestPath, host, (err, results) => {
  53. if (err) {
  54. Editor.error(err);
  55. return;
  56. }
  57. });
  58. }
  59. });
  60. let versionManifestPath = root + '/version.manifest';
  61. utils.accessPath(versionManifestPath, (err)=> {
  62. if (err && err.code === 'ENOENT') {
  63. let assetsdbVersionManifestPath = assetsdb + '/version.manifest';
  64. utils.createVersionManifestAssets(assetsdbVersionManifestPath, host, (err, results) => {
  65. if (err) {
  66. Editor.error(err);
  67. return;
  68. }
  69. });
  70. }
  71. });
  72. }
  73. // 源码目录
  74. let srcEle = viewEL.querySelector('#src');
  75. srcEle.value = update.src;
  76. if (update.src) {
  77. checkManifest(update.src);
  78. }
  79. // 源码目录选择按钮
  80. let srcSelectBtnEle = viewEL.querySelector('#srcSelectBtn');
  81. srcSelectBtnEle.addEventListener('click', (event) => {
  82. let res = Editor.Dialog.openFile({
  83. title: '选择源码根目录',
  84. defaultPath: Editor.Project.path + '/assets',
  85. properties: ['openDirectory', 'createDirectory']
  86. });
  87. if (res !== -1) {
  88. let newPath = res[0];
  89. let projectPathIdx = newPath.indexOf(Editor.Project.path);
  90. if (projectPathIdx === -1) {
  91. srcEle.value = '';
  92. update.src = '';
  93. update.versionManifestUUID = '';
  94. Editor.warn('源码目录必须在本工程' + Editor.Project.path + '中');
  95. return;
  96. }
  97. let assetsIdx = newPath.indexOf('assets');
  98. if (assetsIdx === -1) {
  99. srcEle.value = '';
  100. update.src = '';
  101. update.versionManifestUUID = '';
  102. Editor.warn('源码目录必须在' + Editor.Project.path + '/assets中');
  103. return;
  104. }
  105. let relative = utils.getRelative(Editor.Project.path, newPath);
  106. srcEle.value = relative;
  107. checkManifest(relative);
  108. update.src = relative;
  109. panel.setSettingItem(assetsHotUpdate, update);
  110. }
  111. });
  112. // 目标目录
  113. let destEle = viewEL.querySelector('#dest');
  114. if (update.dest) {
  115. destEle.value = update.dest;
  116. }
  117. // 目标目录选择按钮
  118. let destSelectBtnEle = viewEL.querySelector('#destSelectBtn');
  119. destSelectBtnEle.addEventListener('click', (event) => {
  120. let res = Editor.Dialog.openFile({
  121. title: '选择目标根目录',
  122. defaultPath: Editor.Project.path,
  123. properties: ['openDirectory', 'createDirectory']
  124. });
  125. if (res !== -1) {
  126. let newPath = res[0];
  127. let relative = utils.getRelative(Editor.Project.path, newPath);
  128. destEle.value = relative;
  129. update.dest = relative;
  130. panel.setSettingItem(assetsHotUpdate, update);
  131. }
  132. });
  133. let ignores = update.ignores || [];
  134. let listEle = viewEL.querySelector('#list');
  135. if (!ListItem) {
  136. ListItem = Editor.UI.registerElement('update-ignore-list-item', {
  137. template: `
  138. <div class="item"">
  139. <ui-input id="path" class="path" disabled></ui-input>
  140. <ui-button id="del" class="tiny red">删除</ui-button>
  141. </div>
  142. `,
  143. style: `
  144. .item {
  145. display: flex;
  146. background-color: black;
  147. padding: 2px;
  148. }
  149. .path {
  150. flex: 1;
  151. }
  152. `,
  153. factoryImpl ( text ) {
  154. this.$ = {
  155. path: this.shadowRoot.querySelector('#path'),
  156. del: this.shadowRoot.querySelector('#del')
  157. };
  158. this.$.path.value = text;
  159. this.$.del.addEventListener('click', (event) => {
  160. listEle.removeChild(this);
  161. // 配置中删除
  162. for (let i = 0; i < ignores.length; i++) {
  163. const path = ignores[i];
  164. if (path == text) {
  165. ignores.splice(i, 1);
  166. break;
  167. }
  168. }
  169. });
  170. }
  171. });
  172. }
  173. // 资源列表
  174. ignores.forEach(path => {
  175. let el = new ListItem(path);
  176. listEle.appendChild(el);
  177. });
  178. // 添加资源
  179. let addEle = viewEL.querySelector('#add');
  180. addEle.addEventListener('click', (event) => {
  181. event.stopPropagation();
  182. let res = Editor.Dialog.openFile({
  183. title: '选择需要忽略的资源目录文件',
  184. defaultPath: Editor.Project.path + '/assets',
  185. properties: ['openDirectory', 'openFile']
  186. });
  187. if (res !== -1) {
  188. let newPath = res[0];
  189. let relative = utils.getRelative(Editor.Project.path, newPath);
  190. for (const path of ignores) {
  191. if (path === relative) {
  192. Editor.log(relative + '已经存在!');
  193. return;
  194. }
  195. }
  196. let el = new ListItem(relative);
  197. listEle.appendChild(el);
  198. ignores.push(relative);
  199. update.ignores = ignores;
  200. panel.setSettingItem(assetsHotUpdate, update);
  201. }
  202. });
  203. });
  204. };
  205. })();