WinJS:检查是否在调试模式下运行

时间:2013-02-12 23:49:04

标签: javascript windows-8 winjs

我需要这个,因为许可证信息,我正在寻找一种方法来了解应用程序是在调试还是生产模式下运行。

如果应用程序在调试模式下运行,我需要使用Windows.ApplicationModel.Store.CurrentAppSimulator,否则我需要使用Windows.ApplicationModel.Store.CurrentApp

所以,我正在寻找函数isDebug的实现:

var currentAPP;
if (isDebug()) {
    currentApp = Windows.ApplicationModel.Store.CurrentAppSimulator;
} else {
    currentApp = Windows.ApplicationModel.Store.CurrentApp;
}

任何技巧?

3 个答案:

答案 0 :(得分:4)

Debug.debuggerEnabled告诉您是否附加了调试器。

请注意,这与“它被编译为调试”不同 - 因为JS不是编译的,并不是真正有意义的指标。

答案 1 :(得分:2)

查看WinJS are there #DEBUG or #RELEASE directives?

那里的答案引用了一个方便的NuGet包(https://www.nuget.org/packages/WinRT-JsDebugSymbols/1.0.0),它在您的应用程序中添加并引用后,可以进行简单的检查,看看它是否是使用Debug配置文件编译的:

if (Debug.isDebugBuild) {
     //spot to put debug build only code
}

答案 2 :(得分:2)

鉴于这两种方法都不完全可靠,还有另一种方法可以直接从Visual Studio中获取构建目标设置,然后使用它来引入调试或发布文件。

这是怎么回事。在项目中创建两个.js文件(js-buildinfo文件夹中的debug.js和release.js)并确保通过将其Package Action设置为None而不是Content来将它们从最终包中排除(右键单击,选择Properties,并且您将在解决方案资源管理器下看到这些操作。

以下是基本文件内容:

debug.js:

(function () {
     "use strict"; 

    WinJS.Namespace.define("BuildInfo", {
         isDebugBuild: true,
         isReleaseBuild: false, 

         config: "Debug",
         currentApp: Windows.ApplicationModel.Store.CurrentAppSimulator 

        /*
          * Include debug-only data, service URIs, access tokens, accounts, etc.
          */
     });
 })(); 

release.js:

(function () {
     "use strict"; 

    WinJS.Namespace.define("BuildInfo", {
         isDebugBuild: false,
         isReleaseBuild: true, 

         config: "Release",
         currentApp: Windows.ApplicationModel.Store.CurrentApp 

        /*
          * Include release-only data, service URIs, access tokens, accounts, etc.        
          */
     });
 })(); 

然后,您需要在代码中的任何位置使用BuildInfo。*进行区分。更好的是,尽可能地将特定于构建的内容封装在这些文件中,例如: CurrentApp与CurrentAppSimulator,调用WinJS.Log.startLog等

然后使用MSBuild任务有选择地将一个或另一个文件复制到包中的公用名(例如buildinfo.js)。为此,需要在项目文件中添加BeforeBuild操作。目前,VS不允许通过UI自定义构建JS项目的配置,因此您必须执行以下操作:

  • 右键单击并在VS中卸载项目
  • 右键单击并手动编辑项目
  • 进行以下更改
  • 右键单击并重新加载项目

编辑.jsproj文件我在ItemGroup下添加了以下带有项目文件的条目:

  <ItemGroup>
     <BuildFlagSource Include="js-buildinfo \$(Configuration).js" />
   </ItemGroup>
   <ItemGroup>
     <BuildFlagDestination Include="js\buildinfo.js" />
   </ItemGroup> 

然后更远的地方有一个评论的部分 - 你取消注释它并添加这里显示的元素:

  <Target Name="BeforeBuild">
    <Copy SourceFiles="@(BuildFlagSource)" DestinationFiles="@(BuildFlagDestination)" OverwriteReadOnlyFiles="true" SkipUnchangedFiles="true" />
   </Target>
   <Target Name="AfterBuild">
   </Target>
   <PropertyGroup>
     <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
   </PropertyGroup> 

理想情况下,您必须在项目中将buildinfo.js设置为只读,以防止编辑将在构建中覆盖的内容。

你可以在HTML文件需要的地方使用这一行(通常在使用BuildInfo属性的其他.js文件之前):

<script src="/js/buildinfo.js"></script>

我喜欢这个解决方案:

  • 它是可扩展的,因为您可以将任何想要的内容添加到debug.js和 release.js文件。
  • BuildInfo命名空间可以包含执行特定于构建的工作的方法,这有时是必需的。
  • 它可以隔离这些文件中所有特定于构建的代码,而不是像使用简单的标志一样在整个应用程序的其余部分乱丢。我在这里仍然有一个标志作为选项,但你根本不必使用它。
  • 无论应用程序如何部署,它都能正常工作。
  • 它不依赖于您必须为x86,x64和ARM生成的任何已编译的VS扩展。

一些缺点:

  • 必须手动编辑项目并执行一些一次性配置,例如添加buildinfo.js并将其设置为只读。
  • 您必须确保debug.js和release.js文件定义相同的内容。
  • 考虑到手动步骤,感觉有点脆弱。

但是它确实有效,并且是最接近我使用其他语言的预编译指令。