我相信每个人都熟悉使用大多数解决方案模板中的Debug和Release配置。 以Debug模式构建项目时使用Debug配置,使用Release模式构建项目时使用Release配置,这一点似乎很明显。然而,可能不太清楚的是切换配置时实际发生了什么,或者如何添加自己的自定义配置。今天,我们将深入了解构建配置的世界,看看它们如何能大大提高您的构建时间和生产率。

什么是配置?

简单地说,配置是一组项目属性。在默认的Debug配置中,例如, debugging会启用,在Release配置中不会启用Debug。您可以设置在每个配置中使用的链接器选项,要构建什么架构(CPU),等等。您还可以进一步定义平台,以便根据是否为设备或仿真器构建,可以有单独的项目设置。换言之,你也可以在你的项目中,通过配置|平台来进行每一个项目的设置。

如何编辑配置?

如何编辑和添加一个配置,我们将从一个模板Android项目开始:

在VS for Mac中创建一个新的“Android App”: New Project > Android > App > Android App.
在VS for Windows 创建一个 “Single-View App (Android)”: 创建new project… > Android > Single-View App (Android).

该模板创建了一个简单的Android应用程序,其中有一个点击计数的按钮。它有两个配置默认设置,Debug和Release,和一个平台,AnyCPU。这些只是没有任何内在含义的名字,除了考虑使用配置时。随后我们将增加两个新配置,名字叫DebugDevice 和DebugEmulator。这将使我们能够在调试到设备(ARM)或仿真器(x86)时快速设置所需的项目选项/属性。 每个只为设备或仿真器所需的架构构建,减少开发期间的构建时间。

首先,让我们看看两个默认Debug和Release配置之间有什么不同。为此,右键单击“解决方案资源管理器”中的项目并选择“选项”(VS for Mac)或“属性”(VS for Windows),打开项目属性。一旦项目选项/属性打开,您将在下拉列表中看到配置和平台字段,选择要查看属性设置的配置和平台。 

Project Options

Project Properties

下拉可能不存在(VS for Mac)或禁用(VS for Windows),这意味着您选择的设置页面上的设置是全局的,即它们将应用于所有配置和平台。你能够在构建>全局设置而查看(VS for Mac)或者在应用设置页查看(VS for Windows)。 默认Debug和Release配置的项目设置中的大部分差异在上面所示的Android构建/ Android选项设置页面中。打开项目选项/属性,在左侧选择Android构建(VS for Mac)/ Android选项(VS for Windows)。确保在配置下拉的顶部选择Debug。注意在VS for Mac中选择了“Use Shared Mono Runtime”或者在VS for Windows中选择了“Use  Shared Runtime” ,以及 “Fast  Assembly Deployment” (VS for Mac) / “Use Fast Deployment” (VS for  Windows) 选项。


 这些都是调试时的好选择,因为它们在开发应用程序时会减少构建和部署时间,但是他们根本不擅长构建一个Release版本,因为终端用户不太可能在他们的Android设备上安装一个共享的单运行时,所以应用程序根本就不能运行,因为根本就没有运行时。对于Release 构建你要禁用这个选项。如果现在在配置中选择Release版,在顶部下拉,您将看到默认Release版本配置禁用了这些选项。

您可以检查各个配置的链接器行为:

在VS for Mac: 在Android构建页面中选择“Linker”选项卡。你将看到在Debug配置中 “Linking Behaviour”设置为 “Don’t Link” 面在Release配置中设置为 “Link SDK assemblies only” 。
在VS for Windows: 在Android选项页面中滚动到“Linker Properties” 一节。你将看到在Debug配置中 “Linking” 选项被设置为 “None” 而在Release配置中设置为 “SDK assemblies only”。

这些默认选项允许在调试期间更快地生成,并为您的版本构建提供更小的应用程序包。
在高级选项卡(Mac)/按钮(Windows)允许你设置当你构建Debug或Release时使用哪种CPUs(ABIs)。请注意,默认情况下Debug配置允许为所有可能的CPUs构建。您构建的每一个CPU都需要时间,因此,精简这一点可能很好,所以我们只为CPU构建,我们将运行应用程序。如果我们只测试x86仿真器,然后我们只能建立x86和取消选择其他不需要的Abis。继续取消选择所有但x86使用高级选项/按钮。


祝贺你,您现在刚刚编辑了一个配置。编辑配置就像打开项目选项/属性一样简单,选择要更改设置的配置,并更改这些设置。

如何添加配置?

如果调试过程中只需选择一个配置,就可以轻松地选择在哪一个体系结构上构建,这不是很好吗?如果调试设备我选择一个配置,DebugDevice,如果是为模拟器构建,我选择DebugEmulator。让我们把那个设置好。

Visual Studio for Mac:

在Visual Studio for Mac中添加一个配置:

  1. 在解决方案浏览器中双击解决方案来打开解决方案选项。
  2. 选择左侧的 Build > Configurations on the left (不是 Run > Configurations).
  3. 因为我们需要Debug配置的变体,在“配置”列表中选择Debug并单击“Copy”。这将拷贝当前的Debug设置到你的新配置中。
  4. 输入这个配置的名字,比如DebugDevice。
  5. 平台保持默认的Any CPU选项。
  6. 点击“OK”。
  7.  在DebugEmulator配置中重复4-8步。

Visual Studio (Windows):

在 Visual Studio (Windows)中添加一个配置:

  1. 通过Build > Configuration Manager菜单中,打开配置管理器。
  2. 点击Active Solution Configuration下拉框并选择 “New”。
  3. 在名字字段输入 DebugDevice。
  4. 在 “Copy settings from”下拉列表选择Debug。
  5. 确保选中了 “Create new project configurations” 选项。
  6. 点击OK。
  7.  2 – 6  在名字字段使用ebugEmulator,并重复2 – 6步。

现在,在列表中你将看到四个配置项,Debug, DebugDevice, DebugEmulator, 以及Release。    


现在,您只需打开Android项目选项并对这两个新配置进行所需的更改:

  1. 打开  Android 项目选项。
  2.  选择Android Build (Mac) / Android Options (Windows) > Advanced 选项卡。
  3. 从配置下拉列表选择DebugDevice.
  4. 除了armeabi-v7a之外支持ABIs都取消选择。
  5. 从配置下拉列表选择DebugEmulator.
  6. 除了x86之外所有支持的ABIs都取消选择。

你可以现在无论何时你想调试使用实际的Android设备的选择DebugDevice,你可以当你想调试一个x86模拟器选择DebugEmulator。您的调试构建会更快,因为您只为所需的体系结构构建。

祝贺您,现在已经添加了两个配置,并为特定调试场景设置它们。

如何添加平台?

我们所做的工作是可行的,但是在设备或仿真器的构建之间定义平台而不是配置可能更好。您会注意到这是默认的IOS项目。有iOS项目定义两个平台,iPhone 和iPhoneSimulator。如果我们喜欢,我们也可以这样做。对于这个练习,开始一个新的Xamarin形式工程,PCL或共享型不该锻炼。

Visual Studio for Mac:

在Xamarin/Visual Studio for Mac添加一个平台:

  1. 在解决方案浏览器中通过双击解决方案打开解决方案选项。
  2. 在左侧选择Build > Configurations  (不是Run > Configurations)。
  3. 选择General 选项卡。
  4. 因为我们想要Debug配置的变体,在配置列表选择Debug并点击 “Copy”.。这将拷贝当前的Debug设置到你的新配置中:
  5. 输入配置名字,在这个选项中保存和Debug相同的配置,因为我们只想添加一个平台而不是一个配置。
  6. 在平台字段输入名字AndroidDevice.
  7. 确保 “Create Configurations for all solution items” 选项没被选中。我们只需要这个平台的Android项目。如果选择了这个选项,我们也会将这个平台添加到iOS项目中。
  8. 点击“OK”。
  9. 在名为AndroidEmulator的平台中重复步骤4-8.
  10. 因为我们没有向项目添加这个新平台(步骤7),我们需要在Android项目中重复步骤4-8,Options > Build > Configurations。为AndroidDevice  和ndroidEmulator 平台都这样做。

然后,您必须将解决方案定制平台映射到项目自定义平台:

  1. 打开Solution Options > Build > Configurations > Configuration Mappings 选项卡。
  2. 在最顶层的平台字段选择选择AndroidDevice 平台.
  3. 在Android应用项目的配置列,选择Debug|AndroidDevice。
  4. 在顶端的平台字段选择AndroidEmulator平台。
  5. 在Android应用项目的配置列,选择Debug|AndroidEmulator.

现在,在主配置下拉列表,你将看到 Debug|AndroidDevice and Debug|AndroidEmulator。
.

您可以为每一个平台编辑设置,就像之前设置的配置一样,只要选择要编辑平台中的构建设置的正确平台就可以了。在Project Options > Android Build (Mac) 设置页。

Visual Studio (Windows):

添加自定义平台不直接在Visual Studio是Xamarin Studio。你可以在解决方案级别添加自定义平台的名称,但它添加在项目层面需要一些编辑的.csproj文件。 以下是如何在VisualStudio中实现所有这些:

添加解决方案级平台:

  1. 通过 Build > Configuration Manager 菜单打开Configuration Manager。
  2. 点击Active Solution Platform下拉列表并选择“New”.
  3. 在名字字段输入AndroidDevice.
  4. 在“Copy settings from”下拉列表选择AnyCPU。
  5. 确保没有选中 “Create new project configurations” 选项。在Android应用项目没有选择一个AndroidDevice平台时,如果选中它,你将会得到一个错误。
  6. 点击OK。
  7. 在名字字段使用Androidmulator,重复步骤2 – 6。

现在最困难的部分是在Android应用程序项目中添加新的平台。

  1. 卸载Android应用项目(右击项目并选择卸载)。
  2. 编辑AppName.csproj 文件(右键点击项目并选择 “编辑.csproj”)。
  3. 在打开的项目标记下面粘贴下列XML:

    点击(此处)折叠或打开

    1. <PropertyGroup Condition=" '$(Platform)' == 'AndroidDevice' ">
    2.   <DefineConstants>AndroidDevice</DefineConstants>
    3.   <PlatformTarget>AnyCPU</PlatformTarget>
    4. </PropertyGroup>
    5. <PropertyGroup Condition=" '$(Platform)' == 'AndroidEmulator' ">
    6.   <DefineConstants>AndroidEmulator</DefineConstants>
    7.   <PlatformTarget>AnyCPU</PlatformTarget>
    8. </PropertyGroup>

  4. 寻找以下元素:

    点击(此处)折叠或打开

    1. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  5. 选择文本的所有上述PropertyGroup包括开幕式和闭幕PropertyGroup标签并将它复制。
  6. 粘贴文本两次右下方的propertygroup标签上面复制的结局。

  7. 编辑已粘贴的属性组,更改:

    点击(此处)折叠或打开

    1. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

    点击(此处)折叠或打开

    1. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AndroidDevice' ">
    上面是针对第一处拷贝的修改,下面是对第二处拷贝的修改

    点击(此处)折叠或打开

    1. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AndroidEmulator' ">
  8. 不需要,但最好为每个平台单独outputpath,因此改变:

    点击(此处)折叠或打开

    1. <OutputPath>bin\Debug</OutputPath>

    点击(此处)折叠或打开

    1. <OutputPath>bin\AndroidDevice\Debug</OutputPath>
    这是针对第一处拷贝的修改。

    点击(此处)折叠或打开

    1. <OutputPath>bin\AndroidEmulator\Debug</OutputPath>
    这是对第二处拷贝的修改。

然后,您必须将解决方案定制平台映射到项目自定义平台:

  1. 再次打开Configuration Manager。
  2. 为活动解决方案平台选择AndroidDevice.
  3. Android应用项目的平台列,选择AndroidDevice。
  4. 为活动解决方案平台选择AndroidEmulator.
  5. 在Android应用项目的平台列选择AndroidEmulator。

现在你将要开放的Android项目属性和编辑配置|平台设置,只有建立相关的体系结构,比如AndroidDevice的armeabi-v7s和AndroidEmulator的x86,就像你简易的创建一个新配置。

配置Mapping

当我们添加上面的配置时,我匀将它添加到解决方案级别,通过在Mac选择“Create Configurations for all solution items”和在Windows选择 “Create new project configurations”将他们添加到每一个项目中 (或者手动添加它们到.csproj 文件)。这样,新配置在项目和解决方案级别上都是可用的。通过在Windows中使用Configuration Manager或者在Mac中使用Solution Options > Build > Configurations > Configuration Mappings选项卡将映射解决方案级别配置到项目级别配置中。 您将看到,对于每个项目,您可以选择在配置下拉列表中选择活动解决方案配置时将构建哪个项目配置。

还可以设置每个解决方案配置生成的项目。如果您有一个多个应用程序项目的解决方案,您可以添加一个配置,只用于构建当时需要的项目。  对于Xamarin Forms 应用(或者对于包含多个平台的某些解决方案),您可能需要添加只构建IOS项目的配置(如果使用了PCL项目),一个只构建Android项目(如果使用了PCL项目)。这将再次加快构建时间,因此您只为正在调试的平台构建。

在 .csproj 文件中配置和MSBuild属性

我们简单地接触的.csproj文件自UI没有提供这样的办法在Xamarin Studio在Visual Studio应用程序项目中添加自定义平台时。主要是你会不会编辑.csproj文件但我觉得它是有用的至少接触的项目.csproj文件受影响的当你切换活动配置|平台IDE。

当我们添加一个自定义平台之上,我们两次拷贝和粘贴一个PropertyGroup添加到新平台并且设置新平台的构建输出路径。所使用的每个配置的属性组是一套简单的MSBuild属性和值时将使用相应的配置|平台组合选择建立。例如,下面的属性组时将使用的Debug|AnyCPU 时选中Configuration|Platform:

点击(此处)折叠或打开

  1. <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  2. ...
  3. </PropertyGroup>
当遇到条件 '$(Configuration)|$(Platform)' == 'Debug|AnyCPU',然后在那组MSBuild属性的值将被使用。例如,您会在上面的属性组中找到下面的内容:

点击(此处)折叠或打开

  1. <AndroidLinkMode>None</AndroidLinkMode>
这集的链接器选项“None”当使用Debug|AnyCpu Configuration|Platform组合。你的配置和平台的真的只是一个让你把一堆MSBuild属性只是选择为你建立一个配置|平台特定的值。如果从命令行生成,您可以手动设置任何可用的MSBuild属性使用/p:MSBuildProperty=value 语法。换句话说,如果您想从命令行构建Debug|AnyCPU Configuration|Platform 同时还想使用 “Link SDK Assemblies Only”,你将按照如下方式配置(Windows):

点击(此处)折叠或打开

  1. MSBuild.exe MySolution.csproj /p:Configuration=Debug /p:Platform=AnyCPU /p:AndroidLinkMode=SdkOnly

…或者在Mac:

点击(此处)折叠或打开

  1. MSBuild MySolution.csproj /p:Configuration=Debug /p:Platform=AnyCPU /p:AndroidLinkMode=SdkOnly
你看到的任何属性都定义在.csproj文件中的一个PropertyGroup定义,可能通过命令行构建时使用/p:PropertyName=PropertyValue 开切换一个值。在 中查阅更多信息。


总结

你已经学会了如何创建自定义配置平台以及如何编辑,编译选项你想为一个特定的情况下都可以设置仅仅通过选择适当的配置|平台组合