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;
}

有什么技巧吗?

4

3 回答 3

4

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

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

于 2013-02-13T02:36:55.663 回答
2

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

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

以下是基本文件内容:

调试.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.
          */
     });
 })(); 

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

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

于 2014-02-26T17:03:24.690 回答
2

看看WinJS是否有#DEBUG或#RELEASE指令?

那里的答案引用了一个方便的 NuGet 包 ( https://www.nuget.org/packages/WinRT-JsDebugSymbols/1.0.0 ),一旦在您的应用程序中添加和引用该包,就可以简单地检查它是否使用 Debug 编译轮廓:

if (Debug.isDebugBuild) {
     //spot to put debug build only code
}
于 2014-01-28T23:27:17.647 回答