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

knu*_*nut 19 msdeploy webdeploy

我如何制作包裹

我像这样制作msdeploy包:

msdeploy.exe -verb:sync -source:iisApp=c:\content\ -dest:package=c:\pkg.zip
Run Code Online (Sandbox Code Playgroud)

C:\内容目录中有一个单一的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)
Run Code Online (Sandbox Code Playgroud)

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

archive.xml
systemInfo.xml
Content\c_C
Content\c_C\content
Content\c_C\content\index.html
Run Code Online (Sandbox Code Playgroud)

如果我像这样转储包:

msdeploy.exe -verb:dump -source:package=c:\pkg.zip -xml
Run Code Online (Sandbox Code Playgroud)

我明白了:

<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>
Run Code Online (Sandbox Code Playgroud)

我多么想要它

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

archive.xml
systemInfo.xml
Content\index.html
Run Code Online (Sandbox Code Playgroud)

我希望包能够创建一个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>
Run Code Online (Sandbox Code Playgroud)

我已将iisAppcreateApp提供程序路径属性更改为Default Web Site\Site.我将contentPathdirPath提供程序路径属性更改为c:\inetpub\wwwroot\site.


问题

  • 我怎么能做到这一点?

pet*_*ven 17

您需要查看MS Deploy替换规则,这是MS Deploy团队博客中隐藏的有用功能.

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

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"
Run Code Online (Sandbox Code Playgroud)

运行它应该产生您想要的输出.

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

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

所以程序是:

  • 将您的东西复制到中立的临时位置.
  • 从这里创建您的包.
  • 使用verb:dump查看生成的xml.
  • 再次创建包,并为包中要更改的所有内容添加替换规则.
  • 吃头痛丸;-)


Sky*_*ter 5

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

首先要做的事情:

长部署特定于机器的路径

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

正如帖子中所建议的,可以在项目的Properties/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>
Run Code Online (Sandbox Code Playgroud)

2.)包含在我们之前修改的同一.pubxml文件顶部的以下行

<AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings>
Run Code Online (Sandbox Code Playgroud)

而且...... 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
Run Code Online (Sandbox Code Playgroud)

或者等效的MsDeploy命令行当然.

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

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

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

所以,总之......

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

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

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