我需要这个,因为许可证信息,我正在寻找一种方法来了解应用程序是在调试还是生产模式下运行。
如果应用程序在调试模式下运行,我需要使用Windows.ApplicationModel.Store.CurrentAppSimulator
,否则我需要使用Windows.ApplicationModel.Store.CurrentApp
所以,我正在寻找函数isDebug的实现:
var currentAPP;
if (isDebug()) {
currentApp = Windows.ApplicationModel.Store.CurrentAppSimulator;
} else {
currentApp = Windows.ApplicationModel.Store.CurrentApp;
}
任何技巧?
答案 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项目的配置,因此您必须执行以下操作:
编辑.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>
我喜欢这个解决方案:
一些缺点:
但是它确实有效,并且是最接近我使用其他语言的预编译指令。