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

7

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

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

因此,我正在寻找一个 isDebug 函数的实现:

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

有什么技巧吗?

这有帮助吗?http://stackoverflow.com/questions/12693274/windows-8-app-is-debug - siger
这是C#...我正在寻找一个Javascript的解决方案... - Bruno Croys Felthes
3个回答

4

Debug.debuggerEnabled 会告诉你是否已连接调试器。

请注意,这与“它被编译为调试版”不同——由于 JS 不是编译的,因此这并不是一个真正有意义的指标。


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

具体步骤如下。在项目中创建两个.js文件(debug.js和release.js在js-buildinfo文件夹中),并确保通过将它们的包操作设置为“无”而不是“内容”来排除它们的末端包(右键单击,选择属性,在解决方案资源管理器下,您将看到操作)。

以下是基本文件内容:

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文件定义相同的内容。
  • 考虑到手动步骤,它感觉有点脆弱。

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


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接