转换 ServiceDefinition.csdef

Transform ServiceDefinition.csdef

我已经尝试了我能遇到的每一个可能的例子,但还没有能够完成其中的一个。有没有人设法让 ServiceDefinition.csdef 转换为实际工作?

在下面的每一次尝试中,我都使用了 Bin 文件夹中的 ServiceDefinition.csdef(构建后),然后查看了包文件中的 csdef。我在 'base' 或原始文件中将 vmsize 设置为 'Other'(我知道这不是实际大小),然后使用应该将其更改为 'Large' 但最终文件的转换总是显示 'Other'.

Fabriccontroller.net's Example

SkyLineTechnologies' Example

MSDN Blogger's Example

还有大约 3 或 4 个其他人...

我们构建基于 Umbraco 的网站并将它们托管在 Azure 上。我们设置了 3 个环境(QA、UAT 和 LIVE),并且在每个环境中我们有 2 个 Web 角色(前端和后台)。转换 ServiceDefinition.csdef 的目标是达到以下 vmsizes:

QA-FE:小
QA-BO:小
UAT-FE:小
UAT-BO:小
LIVE-FE:大
直播间:小

我还想指出,我尝试创建多个云服务项目,但正如您从上面的要求中看到的,这有点 'odd'

最后,转换必须能够在我们的 TFS 构建服务器 (vNext) 上进行。

在查看了很多不同的建议后,我提出了我的解决方案,我发现其中一部分有效,但其他建议无效。我最终结合并简化了我发现的工作。

对于这个例子,我们有以下要求:

  • 我们需要构建配置来匹配我们的环境
  • 由于最新版本的 Azure 云服务支持多种服务配置,我们可以通过内置选项进行设置,在我们的例子中,我们也让它与我们的构建配置相匹配。
  • 我们需要能够通过本地 (VS) 和 TFS 发布管理器发布 (通过构建代理)。
  • 我们将有 3 个具有不同大小 VM 的环境
    • QA(小)
    • UAT(大)
    • 直播(特大)

转到 Azure 云服务的项目文件夹 复制 ServiceDefinition.csdef 并将其命名为 ServiceDefinition.Base.csdef 添加 3 个文件,ServiceDefinition.QA.csdef | ServiceDefinition.UAT.csdef | ServiceDefinition.LIVE.csdef 在 Visual Studio 中卸载您的项目并编辑 ccprog 文件 找到包含 ServiceDefinition.csdef 的 ItemGroup,它将如下所示:

<ItemGroup>
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <ServiceConfiguration Include="ServiceConfiguration.QA.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.UAT.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.LIVE.cscfg" />
</ItemGroup>

让它看起来像这样:

<ItemGroup>
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <ServiceConfiguration Include="ServiceConfiguration.QA.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.UAT.cscfg" />
    <ServiceConfiguration Include="ServiceConfiguration.LIVE.cscfg" />
    <None Include="ServiceDefinition.Base.csdef" />
    <None Include="ServiceDefinition.QA.csdef">
       <DependentUpon>ServiceDefinition.csdef</DependentUpon>
    </None>
    <None Include="ServiceDefinition.UAT.csdef">
       <DependentUpon>ServiceDefinition.csdef</DependentUpon>
    </None>
    <None Include="ServiceDefinition.LIVE.csdef">
       <DependentUpon>ServiceDefinition.csdef</DependentUpon>
    </None>
</ItemGroup>

现在转到 ccprog 文件的底部和 Import

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets" />

和结束项目标签

</Project>

添加以下内容:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets" />
<Target Name="BeforeBuild" Condition=" '$(Configuration)' != 'Debug' ">
    <Message Text="Removing Read-Only Attribute from ServiceDefinition.csdef" />
    <Exec Command="attrib -r $(ProjectDir)ServiceDefinition.csdef" />
    <Message Text="Transforming ServiceDefinition.Base.csdef with ServiceDefinition.$(Configuration).csdef to create ServiceDefinition.csdef" />
    <TransformXml Source="ServiceDefinition.Base.csdef" Transform="ServiceDefinition.$(Configuration).csdef" Destination="ServiceDefinition.csdef" />
</Target>

保存并重新加载项目,如果出现任何错误消息,请更正问题。 重新加载后,您的项目文件应如下所示:

打开 ServiceDefinition.QA.csdef 并添加:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudTransform" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" schemaVersion="2015-04.2.6">
  <WebRole name="WebApplication" vmsize="Small" xdt:Transform="SetAttributes" xdt:Locator="Match(name)">
  </WebRole>
</ServiceDefinition>

保存

打开 ServiceDefinition.UAT.csdef 并添加:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudTransform" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" schemaVersion="2015-04.2.6">
  <WebRole name="WebApplication" vmsize="Large" xdt:Transform="SetAttributes" xdt:Locator="Match(name)">
  </WebRole>
</ServiceDefinition>

保存

打开 ServiceDefinition.LIVE.csdef 并添加:

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="AzureCloudTransform" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" schemaVersion="2015-04.2.6">
  <WebRole name="WebApplication" vmsize="XLarge" xdt:Transform="SetAttributes" xdt:Locator="Match(name)">
  </WebRole>
</ServiceDefinition>

保存

完成。

现在,当您构建其中一个构建配置时,转换将在构建之前发生,然后允许 VS 通常 运行 来打包文件。 ServiceDefinition.csdef 文件将在构建之前更改并正确包含在包中。我选择以这种方式进行这种转换的最大原因是因为它适用于我们使用 vNext 构建定义的构建服务器。