Angularjs 离线Chrome打包应用程序:如何管理产品和开发模式

Angularjs 离线Chrome打包应用程序:如何管理产品和开发模式,angularjs,google-chrome-extension,google-chrome-devtools,google-chrome-app,cordova-chrome-app,Angularjs,Google Chrome Extension,Google Chrome Devtools,Google Chrome App,Cordova Chrome App,为了在服务器上的dev/stage/prod之间切换,我设置了一个ENV变量。这是相当标准的 使用离线Chrome应用程序,如何在dev/stage/prod之间切换?特别是关于RESTAPI URL的 在开发过程中,我的应用程序作为“未打包”的应用程序安装在chrome中 解决方案: 我把这些答案结合起来。以下是我所做的: 在安装时,如果未打包扩展,我将在localStorage中设置一个值 在应用程序运行时,我将变量设置为localstorage值,如果未定义,则设置为production

为了在服务器上的dev/stage/prod之间切换,我设置了一个ENV变量。这是相当标准的

使用离线Chrome应用程序,如何在dev/stage/prod之间切换?特别是关于RESTAPI URL的

在开发过程中,我的应用程序作为“未打包”的应用程序安装在chrome中

解决方案:

我把这些答案结合起来。以下是我所做的:

  • 在安装时,如果未打包扩展,我将在localStorage中设置一个值

  • 在应用程序运行时,我将变量设置为localstorage值,如果未定义,则设置为production

  • FWIW,这是代码:

    background.js:

    chrome.runtime.onInstalled.addListener(function () {
      console.log('onInstalled');
    
      // Note: this event is fired every time the "Reload" link is clicked in
      // 'Chrome Apps & Extensions Developer Tool'.  So only set if not set.
    
      // If unpacked extension, 
      if(!chrome.runtime.getManifest().update_url) {
        // Load existing value
        chrome.storage.local.get('APIBaseURL', function(data) {
          // Has value already been set?
          if (!data.hasOwnProperty('APIBaseURL')) {
            // set API server to localhost
            chrome.storage.local.set({'APIBaseURL': DEV_APIBASEURL }, function() {
              // Ok, notify the console.
              console.log('Installed in dev mode: APIBaseURL = '+DEV_APIBASEURL);
            } );
          }
        });
      }
    });
    
    App.js(这是有角度的,但你应该看到模式。承诺是ES6)

    $rootScope.promiseAppReady
    在代码完成和应用程序准备就绪时通知我。
    $rootScope.$apply()
    气泡将更改到其他范围。如果不使用Angular,可以删除此项

    我还将此代码与一些调试工具一起包含:

    var debugTools = {
      setAPIBaseURL: function (url) {
        chrome.storage.local.set({'APIBaseURL': url});
      },
      showAPIBaseURL: function() {
        chrome.storage.local.get('APIBaseURL', function(data) {console.log(data)});
      }
    
    }
    

    因此,在控制台中很容易进行更改。

    在控制台中
    chrome.runtime.getManifest().update\u url
    如果从应用商店安装,将具有一个值。如果没有,则未定义


    和控制台中的
    chrome.runtime.getManifest().update\u url
    如果是从存储安装的,则会有一个值。如果没有,则未定义


    根据您的描述,我认为您不希望Chrome应用程序仅在从Chrome Web应用商店安装时与远程服务器通话,并且仅在未打包安装时与本地服务器通话。我认为您可能希望选择与任何一台服务器对话,无论它是如何安装的


    因此,我会对应用程序进行编程,根据本地存储中的密钥选择其服务器。然后可以从“开发人员工具”面板(资源)选项卡轻松设置该键。如果密钥未定义,它将使用远程服务器。

    根据您的描述,我认为您不希望Chrome应用程序仅在从Chrome Web Store安装时与远程服务器通信,并且仅在未打包安装时与本地服务器通信。我认为您可能希望选择与任何一台服务器对话,无论它是如何安装的


    因此,我会对应用程序进行编程,根据本地存储中的密钥选择其服务器。然后可以从“开发人员工具”面板(资源)选项卡轻松设置该键。如果密钥未定义,则使用远程服务器。

    可能重复的Chrome应用程序不是Chrome扩展。“你帮不了忙。@MichaelCole有些答案适用于扩展和应用程序。至于没有帮助,请保持问答格式:编辑您的问题以删除解决方案,并将其作为另一个答案发布。@xan,我发现StackOverflow超过mod'd。很抱歉向您发泄。可能重复的Chrome应用程序不是Chrome扩展。“你帮不了忙。@MichaelCole有些答案适用于扩展和应用程序。至于没有帮助,请保持问答格式:编辑您的问题以删除解决方案,并将其作为另一个答案发布。@xan,我发现StackOverflow超过mod'd。很抱歉拿你出气。这是个好答案。您可以将其概括为基于其他内容(如应用程序版本)切换行为,然后使用脚本生成清单的prod/dev版本。这是一个很好的答案。您可以将其概括为基于其他内容(如应用程序版本)切换行为,然后使用脚本生成清单的prod/dev版本。
    var debugTools = {
      setAPIBaseURL: function (url) {
        chrome.storage.local.set({'APIBaseURL': url});
      },
      showAPIBaseURL: function() {
        chrome.storage.local.get('APIBaseURL', function(data) {console.log(data)});
      }
    
    }