【问题标题】:Modify files after deployment package is created创建部署包后修改文件
【发布时间】:2013-06-14 12:52:28
【问题描述】:

我正在通过服务器上的自动构建触发器创建 Web 部署包。 该软件包应负责所需的任何服务器上的所有内容(包括创建特定网站、应用程序池和最新代码)。

我从已配置的本地 IIS 站点手动提取了一个部署包,其中包含 MsDeploy 创建站点、应用程序池等所需的所有信息... 它们存在于以下文件中

archive.xml
parameters.xml
systeminfo.xml

现在的想法是,我将在构建服务器上自动创建一个部署包,其中包含新编译的代码,但在 .zip 包中包含上述 xml 文件。

现在,我正在构建应用程序,然后执行一个 PowerShell 脚本,该脚本将使用我拥有的文件手动覆盖 .zip 中的文件。

但是,我知道您可以扩展目标文件(在您的项目中使用 .wpp.targets 文件)以插入管道并在此过程中进行修改。 不幸的是,我对找到的信息有点迷失了。

我想:

1) 配置部署包的创建以使用我现有的 .xml 文件。

2) 如果不可能,请在创建包后用我自己的文件覆盖这些文件。

我的目标是在构建完成后拥有一个完整的可执行部署包,因此我不再需要 PowerShell 脚本。

非常感谢任何能让我更接近解决方案或帮助我更清楚地理解 msbuild 目标和/或 webdeploy 的信息。

【问题讨论】:

    标签: msbuild msdeploy


    【解决方案1】:

    我通过扩展 Package MsBuild 目标来做到这一点。

    在 web 项目的根目录中添加一个 .wpp.targets 文件,内容如下。

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Import Project="..\packages\MSBuild.ExtensionPack.4.0\MSBuild.ExtensionPack.tasks"/>
    
      <PropertyGroup>
        <DeployFilesDirectory>$(MSBuildProjectDirectory)\Deploy\</DeployFilesDirectory>
      </PropertyGroup>
    
      <PropertyGroup>
        <OnAfterPackageUsingManifest>
          $(OnAfterPackageUsingManifest);
          CopyDeployFiles;
          ReplaceSetParametersFile;
          <!--ZipDeploymentFiles;-->
        </OnAfterPackageUsingManifest>
      </PropertyGroup>
    
      <Target Name="CopyDeployFiles">
        <Message Text="Copy Deploy Files"></Message>
    
        <ItemGroup>
          <Files Include="$(DeployFilesDirectory)*.xml" Exclude="$(DeployFilesDirectory)setParameters.xml"></Files>
        </ItemGroup>
    
        <MSBuild.ExtensionPack.Compression.Zip TaskAction="AddFiles"
                                               CompressFiles="@(Files)"
                                               ZipFileName="$(PackageFileName)"
                                               RemoveRoot="$(DeployFilesDirectory)"/>
      </Target>
    
      <Target Name="ReplaceSetParametersFile" DependsOnTargets="GenerateSampleDeployScript">
        <Message Text="Replace Default SetParameters File"></Message>
        <Copy DestinationFiles="$(GenerateSampleParametersValueLocationDefault)"
              SourceFiles="$(DeployFilesDirectory)setParameters.xml"></Copy>
      </Target>
    
    </Project>
    

    第一个目标在 MsDeploy 创建包后执行,并将替换 .zip 文件中的 .xml 文件。我正在使用MsBuild.ExtensionPack Zip 支持。

    第二个目标在构建创建示例 .cmd 和 setParameters 文件后执行,并且也会用我自己的覆盖 setParameters.xml。

    理解 MsBuild 目标等的概念需要一段时间,但一旦你理解了它就会变得非常强大。

    现在创建包就像启动 MsBuild 一样简单

    msbuild "D:\Projects\MyWebProject.csproj" /T:Package /P:Configuration=Release;Platform="AnyCPU";PackageLocation="D:\DeployPackage\package.zip";PublishProfile=MyProfile
    

    并且部署和之前一样

    package.deploy.cmd /Y –setParamFile :myParameterFile.xml
    

    【讨论】:

      【解决方案2】:

      假设您的路径保持不变,您可以通过将 existing zip 指定为您的 -dest:package=package.zip 来实现此目的。 MSDeploy 将自动覆盖 zip 中的文件。

      【讨论】:

      • 对不起,今天忙于其他问题,所以我没有时间测试这个。我想这是当您使用 MsDeploy.exe 创建包时,而不是通过 MBuild。所以你是说它只会在zip中写入Content文件夹?
      • 您没有理由不能使用 MSBuild 完成此任务,但需要更多地研究 Microsoft.Web.Publishing.targets(或召唤 Sayed Ibrahim Hashimi)来弄清楚如何实现它。
      • 是的,这正是我要走的路,但它很长;-)
      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2015-12-02
      相关资源
      最近更新 更多