我已经尝试了我能遇到的每一个可能的例子,但还没有能够做出这些工作中的一个。有没有人设法让 ServiceDefinition.csdef 转换实际工作?
在以下每次尝试中,我都使用了 Bin 文件夹中的 ServiceDefinition.csdef(构建后),然后查看了包文件中的 csdef。我将“基本”或原始文件中的 vmsize 设置为“其他”(我知道这不是实际大小),然后使用本应将其更改为“大”的转换,但最终文件始终显示“其他”。
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:大
直播:小
我还想指出,我尝试创建多个云服务项目,但正如您在上面的要求中看到的那样,这使它有点“奇怪”
最后,转换必须能够在我们的 TFS 构建服务器 (vNext) 上发生。
最佳答案
在查看了许多不同的建议后,我想出了我的解决方案,我发现其中的一部分有效,但其他的无效。我最终结合并简化了我发现的工作。
对于此示例,我们有以下要求:
(通过构建代理)。
转到 Azure 云服务的项目文件夹
复制 ServiceDefinition.csdef 并将其命名为 ServiceDefinition.Base.csdef
添加3个文件,ServiceDefinition.QA.csdef | ServiceDefinition.UAT.csdef |服务定义.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 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 构建定义的构建服务器。
关于c# - 转换 ServiceDefinition.csdef,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40957487/