鉴于这两种方法都不是完全可靠的,还有另一种方法,通过直接从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
});
})();
release.js:
(function () {
"use strict";
WinJS.Namespace.define("BuildInfo", {
isDebugBuild: false,
isReleaseBuild: true,
config: "Release",
currentApp: Windows.ApplicationModel.Store.CurrentApp
});
})();
您可以在代码中使用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文件定义相同的内容。
- 考虑到手动步骤,它感觉有点脆弱。
但它确实有效,并且是我使用其他语言预编译指令时所遇到的最接近的东西。