使用msdeploy创建包时,为提供者iisApp指定不同的路径

时间:2011-07-07 21:29:12

标签: msdeploy webdeploy

我如何制作包

我像这样制作msdeploy包:

msdeploy.exe -verb:sync -source:iisApp=c:\content\ -dest:package=c:\pkg.zip

c:\ content 目录中有一个 index.html 文件。

结果

输出如下:

Info: Adding package (package).
Info: Adding child iisApp (c:\content\).
Info: Adding child createApp (c:\content\).
Info: Adding child contentPath (c:\content\).
Info: Adding child dirPath (c:\content\).
Info: Adding child filePath (c:\content\index.html).
Total changes: 6 (6 added, 0 deleted, 0 updated, 0 parameters changed, 0 bytes copied)

如果我将 c:\ pkg.zip 的内容提取到目录 c:\ pkg 中,它看起来像这样:

archive.xml
systemInfo.xml
Content\c_C
Content\c_C\content
Content\c_C\content\index.html

如果我像这样转储包:

msdeploy.exe -verb:dump -source:package=c:\pkg.zip -xml

我明白了:

<output>
    <MSDeploy.iisApp>
        <iisApp path="c:\content\">
            <createApp 
                path="c:\content\" 
                isDest="False" 
                managedRuntimeVersion="" 
                enable32BitAppOnWin64="" 
                managedPipelineMode="" 
                applicationPool="" 
                appExists="True" />
            <contentPath path="c:\content\">
                <dirPath 
                    path="c:\content\" 
                    securityDescriptor="D:" 
                    parentSecurityDescriptors="" 
                    attributes="Directory">
                    <filePath 
                        path="index.html" 
                        size="0" 
                        attributes="Archive" 
                        lastWriteTime="07/07/2011 20:58:00" 
                        securityDescriptor="D:" />
                </dirPath>
            </contentPath>
        </iisApp>
    </MSDeploy.iisApp>
</output>

我希望它如何

我不希望程序包依赖于站点文件的当前位置。我打算把包发给客户,我不希望任何有关包装过程的细节随包装一起发货。我希望包 c:\ pkg.zip 的内容如下所示:

archive.xml
systemInfo.xml
Content\index.html

我希望软件包能够创建IIS应用程序,因此我需要一个虚拟路径。我还想将软件包安装到默认位置。所以物理路径也必须改变。我希望转储看起来像这样:

<output>
    <MSDeploy.iisApp>
        <iisApp path="Default Web Site\Site">
            <createApp 
                path="Default Web Site\Site"
                isDest="False" 
                managedRuntimeVersion="" 
                enable32BitAppOnWin64="" 
                managedPipelineMode="" 
                applicationPool="" 
                appExists="False" />
            <contentPath path="c:\inetpub\wwwroot\site">
                <dirPath 
                    path="c:\inetpub\wwwroot\site" 
                    securityDescriptor="D:" 
                    parentSecurityDescriptors="" 
                    attributes="Directory">
                    <filePath 
                        path="index.html" 
                        size="0" 
                        attributes="Archive" 
                        lastWriteTime="07/07/2011 20:58:00" 
                        securityDescriptor="D:" />
                </dirPath>
            </contentPath>
        </iisApp>
    </MSDeploy.iisApp>
</output>

我已将 iisApp createApp 提供程序路径属性更改为Default Web Site\Site。我将 contentPath dirPath 提供程序路径属性更改为c:\inetpub\wwwroot\site


问题

  • 我该如何做到这一点?

4 个答案:

答案 0 :(得分:17)

您需要查看MS Deploy替换规则,这是一项有用的功能well hidden on the MS Deploy Team Blog

在您的情况下,您将需要使用一堆替换表达式扩展命令行,如下所示:

msdeploy.exe 
-verb:sync 
-source:iisApp=c:\content\ 
-dest:package=c:\pkg.zip
-replace:objectName=iisApp,targetAttributeName=path,
         replace="Default Website\Site"
-replace:objectName=createApp,targetAttributeName=path,
         replace="Default Website\Site"
-replace:objectName=contentPath,targetAttributeName=path,
         replace="c:\inetpub\wwwroot\site"
-replace:objectName=dirPath,targetAttributeName=path,match="^c:\content",
         replace="c:\inetpub\wwwroot\site"

运行它应该产生你想要的输出。

在上面的示例中,前3个替换规则按标记名称(objectName)和属性名称(targetAttributeName)匹配,并使用指定的替换字符串覆盖。 最后一个替换规则将匹配以“c:\ content”开头的所有dirPath标记的所有路径属性,并且将仅使用替换字符串替换属性值的那部分。

最后,我还没有找到避免让包zip文件包含原始源文件夹名称的方法。唯一的解决方法是从中性的临时位置打包,例如“c:\ site”。

所以程序是:

  • 将您的资料复制到中立的临时位置。
  • 从这里创建您的包。
  • 使用动词:转储查看生成的xml。
  • 再次创建您的包,并为要在包中更改的所有内容添加替换规则。
  • 服用止痛药; - )

答案 1 :(得分:5)

我或多或少有同样的问题。

首先要做的事情:

长部署机器特定路径

为此,我使用了http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

处的技巧

正如帖子中所建议的那样,可以在属性/ PublishProfiles 文件夹下修改所需的(你可以拥有多个 .pubxml 文件在你的项目中。这是我遵循的方法,因为它允许我自定义每个发布配置文件的行为。

如果我没有弄错的话,我相信您可以对项目中的 {project-name} .wpp.targets 文件(可能还不存在)应用相同的修改根目录。但是,此处的更改会影响 Web发布管道(wpp),从而影响项目中的所有发布配置文件。

然而...

当您将连接字符串替换为发布配置文件提供的连接字符串时,此方法即将破坏您的部署。原因是:上述技巧不会影响连接字符串,因为它们是由构建时的wpp自动创建的。寮步,呵呵!

我为这个问题找到的解决方案有两个方面:

1。)创建了一个 parameters.xml 文件,我手动声明了连接字符串。好吧,也许我从我的软件包的.zip文件中的parameters.xml文件中复制它们,因为我正在部署到一个软件包。这有帮助。

他们看起来像这样:

<parameter name="myConnection-Web.config Connection String" defaultValue="" tags="SqlConnectionString" 
        description="myConnection Connection String used in web.config by the application to access the database.">
    <parameterEntry kind="XmlFile" scope="DeploymentPackage\\Web\.config$" match="/configuration/connectionStrings/add[@name='myConnection']/@connectionString" />
</parameter>

2。)包含以前修改过的 .pubxml 文件顶部的以下行

<AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>

并且...... Voilà!

创建ISS应用程序

使用上述方法希望您声明了几个参数,包括连接字符串。

但是,创建包时,无论您是否创建了parameters.xml,都会为您创建 *。SetParameters.xml 模板文件。在其中,您将看到“IIS Web应用程序名称”的第一个参数,它将默认为您在发布配置文件中插入的任何内容。你可以改变它;无论你想要什么。

还记得之前我说模板吗?我的意思是;它只是一个模板。您可以选择 *。SetParameters.xml 文件并根据需要制作尽可能多的副本。它们适用于什么?环境相关参数。你可以有一个:

  • DEV.SetParameters.xml
  • QA.SetParameters.xml
  • Staging.SetParameters.xml
  • Production.SetParameters.xml
  • ......依旧等等

然后使用最适合作业(或环境)的参数文件,如下所示:

{yourProjectName}.deploy.cmd /Y /M:{targetServer} [...] -setParamFile:QA.SetParameters.xml

或其等效的MsDeploy命令行当然。

现在,默认情况下,在构建时为您创建的清单,并在 archive.xml 文件下的软件包中存储,将使用 iisApp 提供商首先是最重要的。这很好,因为与 createApp 提供程序不同,此提供程序实际上会为您创建目录(如果它不存在)。至少根据TechNet的这篇说明:

  

“与iisApp提供程序不同,如果新应用程序的物理文件夹不存在,则createApp提供程序不会在父站点的文件夹下创建物理文件夹;它只会在配置中为此类文件夹创建引用。如果要创建物理文件夹,则必须在使用createApp之前或之后手动创建它。因此,您通常应该使用iisApp提供程序.iisApp提供程序是更合适的选择,因为它使用createApp提供程序作为一系列步骤中的初始步骤,包括在配置中创建应用程序,如果文件夹不存在,则为应用程序创建物理文件夹,以及将内容文件复制到新应用程序的文件夹中。“ p>

我很乐意加入这些链接......但由于我没有10分以上,每个帖子只允许一个。去搞清楚! :)

所以,简而言之......

...通过第一部分完成的工作,您可能不需要做太多工作就可以在目标服务器中的部署时间创建文件夹。

如果您确实需要覆盖它,您可以定义自己的清单文件并从中部署(单独的主题)...或者您可以关注@peter_raven建议并使用覆盖其值来自MsDeploy的-Replace 规则。

任何一个都可以作为魅力。

答案 2 :(得分:4)

通过提供kind,scope和match属性来删除包前缀,如下所示:

"msdeploy.exe" \
     -verb:sync                                                   \
     -source:iisApp="[Path to your website contents]"             \
     -declareParam:name="IIS Web Application Name",kind="ProviderPath",scope="IisApp",match="^C:\\path\\to\\your\\site\\folder",defaultValue="Default Web Site/SomeSite"  \
     -dest:package=[WebDeployPackageName].zip

答案 3 :(得分:1)

在使用@SkyFighter的解决方案时,我设法解决了手动定义的连接字符串的问题。现在可以使用自动参数化功能,并使连接字符串参数具有正确的范围。

幸运的是,WPP中有一个地方可以注入。不幸的是,我不得不使用 AfterTarget / BeforeTarget 而不是 SomeTargetDependsOn 变量来缩小新目标的展示位置。

这是目标本身:

<Target Name="Replace_WebConfigsToAutoParmeterizeCS_TransformScope"
        AfterTargets="PreAutoParameterizationWebConfigConnectionStrings"
        BeforeTargets="AutoParameterizationWebConfigConnectionStringsCore"
        Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' ">
  <ItemGroup>
    <_WebConfigsToAutoParmeterizeCS>
      <TransformScope>$([System.String]::Copy('%(TransformScope)').Replace('$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))', '$(PackagePath)'))</TransformScope>
    </_WebConfigsToAutoParmeterizeCS>
  </ItemGroup>
</Target>

它由与Sayed的样本相同的变量驱动,用于修复长路径。所以将这个目标放在那些已经可用的变量的任何地方。

P.S。这个技巧/黑客至少需要MSBuild v3.5,首先引入元数据操作。