Powershell 如何修改cspkg中定义的csdef

Powershell 如何修改cspkg中定义的csdef,powershell,msbuild,azure,Powershell,Msbuild,Azure,为了部署到不同的azure环境,我在编译步骤中修改了csdef以更改主机头。这样做需要为每个环境构建一次cspkg,而不是能够重用cspkg并为部署指定不同的配置 我想在cspkg的csdef文件创建之后修改它,而不需要重新编译。这是可能的吗?如果是,怎么可能?据我所知,在创建.cspkg之后,您无法轻松修改它。我想您可能在技术上可以这样做,因为.cspkg是一个遵循特定结构的zip文件 我想问的问题是为什么?如果要修改VM角色大小之类的设置(因为它是在.csdef文件中定义的),那么我认为您有

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


我想在cspkg的csdef文件创建之后修改它,而不需要重新编译。这是可能的吗?如果是,怎么可能?

据我所知,在创建.cspkg之后,您无法轻松修改它。我想您可能在技术上可以这样做,因为.cspkg是一个遵循特定结构的zip文件

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

  • 为每个变体创建单独的Windows Azure部署项目(.csproj)。是的,我意识到这可能是一种痛苦,但它确实允许VisualStudio工具正常工作。轻微的痛苦可能值得有更易于使用的工具支持
  • 在生成过程中运行配置文件转换。类似于web.config转换

就个人而言,我采用不同的.csproj方法。主要是因为我不是一个配置文件转换忍者。(还没有)这是阻力最小的路径,到目前为止,它运行得非常好。

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

  • 打开命令窗口并找到与windows Azure项目相关的CSDEF/CSCFG和CSX文件夹所在的文件夹
  • 根据您的微小更改创建多个CSDEF
  • 确保Windows Azure SDK位于启动CS*命令的路径中
  • 使用CSPACK命令和pass参数使用不同的CSDEF并输出CSPKG文件,如下所示:
  • cspack\ServiceDefinitionOne.csdef/out:projectNameName.csx/out:ProjectOne.cspkg/\u AddMoreParams

    cspack\servicefinitiontwo.csdef/out:ProjectNameSame.csx/out:ProjectTwo.cspkg/\u AddMoreParams


    关于CSPACK的更多信息:

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

    <ItemGroup>
        <ServiceConfiguration Include="ServiceConfiguration.Test.cscfg" />
        <ServiceDefinition Include="ServiceDefinition.csdef" />
        <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
    </ItemGroup>
    
    
    
    添加指向新创建文件的新ServiceDefinition项。现在查找以下行:

    <Import Project="$(CloudExtensionsDir)Microsoft.WindowsAzure.targets" />
    
    
    
    然后添加此代码块,编辑targetprofile检查,使其成为您希望用于备用的生成配置,并确保它指向新的.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添加任何新设置,则需要手动将其添加到此备用版本。

    这似乎是正确的,但我认为我遗漏了一些内容。编译之后,我只有一个cspkg和cscfg,我不知道如何获得csx文件夹。另外,我读到cspkg文件上有加密,这会破坏加密吗?在Azure SDK 1.5之后,cspkg没有加密,所以不用担心。如果您运行正确的CSPACK命令,它将生成CSPKG,因此请继续工作,否则请提供您的命令,我将检查错误。我运行
    msbuild/nologo solution.sln/p:SkipInvalidConfigurations=true/p:PublishDir=C:\PublishDir/p:TargetProfile=dev/t:publish/p:OutDir=C:\outputDir/p:Configuration=“Release”/p:Platform=“任意CPU”/p:runcodealysis=“False”/v:minimal
    我的发布目录中还有一个cspkg文件。我不确定如何获取csx文件夹。您的意思是为每个部署目标添加一个新的ccproj吗?是-为每个部署目标创建一个新的Windows Azure部署项目(.ccproj)。这可以工作,但需要重新编译。我希望能够在不重新编译的情况下交换csdef文件。