如何修改cspkg中定义的csdef

时间:2012-05-03 14:07:26

标签: powershell msbuild azure

要部署到不同的azure环境,我会在编译步骤中修改csdef以更改主机头。这样做需要为每个环境构建一次cspkg,而不是能够重用cspkg并为部署指定不同的配置。

我希望在创建cspkg后修改cspkg的csdef文件,而无需重新编译。这有可能,如果是这样的话?

3 个答案:

答案 0 :(得分:6)

我做了类似于你所做的事情,以区分测试环境和实时环境。首先,您需要创建一个要用于备用设置的新.csdef文件。这需要是完整的文件,因为我们只是将其与原始文件交换。现在我们需要将其添加到云项目中。右键单击云项目并选择卸载项目。再次右键单击它并选择编辑[项目名称]。有一节看起来有点像这样:

<ItemGroup>
    <ServiceConfiguration Include="ServiceConfiguration.Test.cscfg" />
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
</ItemGroup>

添加一个指向新创建文件的新ServiceDefinition项。现在找到以下行:

<Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />

然后添加此代码块,将TargeProfile检查编辑为您希望用于备用项的构建配置,并确保它指向新的.csdef文件

<Target Name="AfterResolveServiceModel">
    <!-- This should be run after it has figured out which definition file to use
        but before it's done anything with it.  This is all a bit hard coded, but
        basically it should remove everything from the SourceServiceDefinition
        item and replace it with the one we want if this is a build for test-->
    <ItemGroup>
      <!-- This is an interesting way of saying remove everything that is in me from me-->
      <SourceServiceDefinition Remove="@(SourceServiceDefinition)" />
      <TargetServiceDefinition Remove="@(TargetServiceDefinition)" />
    </ItemGroup>
    <ItemGroup Condition="'$(TargetProfile)' == 'Test'">
      <SourceServiceDefinition Include="ServiceDefinition.Test.csdef" />
    </ItemGroup>
    <ItemGroup Condition="'$(TargetProfile)' != 'Test'">
      <SourceServiceDefinition Include="ServiceDefinition.csdef" />
    </ItemGroup>
    <ItemGroup>
      <TargetServiceDefinition Include="@(SourceServiceDefinition->'%(RecursiveDirectory)%(Filename).build%(Extension)')" />
    </ItemGroup>
    <Message Text="Source Service Definition Changed To Be: @(SourceServiceDefinition)" />
  </Target>

要恢复正常,请右键单击项目并选择“重新加载项目”。现在,在构建项目时,根据您使用的配置,它将使用不同的.csdef文件。值得注意的是,设置编辑器不知道你的第二个.csdef文件,所以如果你通过GUI添加任何新设置,你需要手动将它们添加到这个备用版本。

答案 1 :(得分:3)

如果您想要一个不同的CSDEF,那么您可以直接使用CSPACK命令提示符轻松完成,如下所示:

  1. 打开命令窗口并找到与Windows Azure项目相关的CSDEF / CSCFG和CSX文件夹的文件夹
  2. 根据您的小改动创建多个CSDEF
  3. 确保在路径中安装Windows Azure SDK以启动CS *命令
  4. 使用CSPACK命令并传递参数以使用与以下类似的不同CSDEF和输出CSPKG文件:
  5. cspack <ProjectName>\ServiceDefinitionOne.csdef /out:ProjectNameSame.csx /out:ProjectOne.cspkg /_AddMoreParams

    cspack <ProjectName>\ServiceDefinitionTwo.csdef /out:ProjectNameSame.csx /out:ProjectTwo.cspkg /_AddMoreParams

    有关CSPACK的更多信息:http://msdn.microsoft.com/en-us/library/windowsazure/gg432988.aspx

答案 2 :(得分:0)

据我所知,创建后无法轻松修改.cspkg。我猜你可能在技术上可以,因为.cspkg是一个遵循某种结构的zip文件。

我问的问题是为什么?如果要修改VM角色大小等设置(因为它是在.csdef文件中定义的),那么我认为您有几种替代方法:

  • 为每个变体创建单独的Windows Azure部署项目(.csproj)。是的,我意识到这可能很痛苦,但它确实允许Visual Studio工具运行良好。轻微的痛苦可能是值得的,以便更容易使用工具支持。
  • 在构建过程中运行配置文件转换。与web.config转换类似。

就个人而言,我采用不同的.csproj方法。主要是因为我不是配置文件转换忍者。 。 。然而。 ;)这是阻力最小的路径,到目前为止它运作良好。