2011-07-07 41 views
16

創建包時,指定供應商iisApp不同的路徑如何使包裝

我讓msdeploy包這樣的:與msdeploy

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

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) 

如果我提取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> 

我已經改變了iisAppcreateApp提供商路徑屬性是Default Web Site\Site。我更改了contentPathdirPath提供程序路徑屬性爲c:\inetpub\wwwroot\site


問題

  • 我怎樣才能做到這一點?

回答

15

你需要看MS部署替換規則,一個有用的功能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標籤的所有路徑屬性,並且將替換只替換屬性值的部分替換字符串。

最後,我還沒有找到一種方法來避免包壓縮文件包含原始源文件夾名稱。唯一的解決方法是從一箇中立的臨時位置打包,比如「c:\ site」。

因此,程序是:

  • 你的東西複製到一箇中立的臨時位置。
  • 從這裏創建你的軟件包。
  • 使用動詞:dump來查看生成的xml。
  • 使用添加的替換規則再次創建您的軟件包,以便在軟件包中更改所有內容。
  • 採取頭痛藥;-)
4

我或多或少同樣的問題。

首先:

長部署 - 機 - 特定路徑

爲此,我曾經在http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

發現特技如在後建議,可以修改所需的(你可以有幾個.pubxml文件屬性/發佈配置文件文件夾在您的項目。這是我遵循的方法,因爲它允許我自定義每個發佈配置文件的行爲。

如果我沒有弄錯,我相信你可以對項目根目錄下的{project-name} .wpp.targets文件(它可能還沒有存在)應用相同的修改。雖然這裏發生了變化,但會影響Web發佈管道(wpp),從而影響項目中找到的所有發佈配置文件。

但是...

這種做法只是破壞你的部署,當談到時間與您發佈配置文件提供的,以取代連接字符串。原因:上述技巧不會影響連接字符串,因爲它們是由wpp自動創建的,其編譯時間爲,編譯時間爲。寮步,呵呵!

我發現該問題的解決方案是雙重的:

1)創建一個的parameters.xml文件,其中我手動聲明的連接字符串。好的,也許我從包的.zip文件中的parameters.xml文件複製它們,因爲我正在部署到一個包。這有幫助。

他們看上去somegthing這樣的:

<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)在包括我們前面修改

<AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings> 

而同樣.pubxml文件的頂部以下行... 瞧!

創建ISS應用

通過以上方法希望你宣佈的幾個參數,包括連接字符串。

當你創建一個包,但是,無論是否需要在創建的parameters.xml與否,一個* .SetParameters.xml模板文件爲您創建。在它內部,你會看到「IIS Web Application Name」的第一個參數,它默認爲你在發佈配置文件中插入的任何參數。你可以改變它;任何你想要的。

還記得我說過模板之前嗎?我的意思是;它只是一個模板。你應該採取* .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提供程序。更合適的選擇,因爲它使用createApp提供程序作爲一系列步驟的初始步驟,這些步驟包括在配置中創建應用程序,爲應用程序創建物理文件夾(如果文件夾不存在)以及複製內容文件放入新應用程序的文件夾中通貨膨脹「。

我很樂意包含這些鏈接......但是因爲我沒有10+個積分,所以我只允許每個帖子發一個帖子。去搞清楚! :)

因此,簡而言之...

...通過對第一部分所做的工作,你可能不會需要做很多工作纔能有文件夾在部署時創建在目標服務器中。

萬一你需要重寫,雖然,你可以定義自己的清單文件和部署關閉它(一個獨立的主題)...或者你可以使用-Replace遵循@peter_raven意見並覆蓋其價值來自MsDeploy的規則

任何一個都可以作爲魅力。

+0

一個小點凸塊,因爲這指出我在正確的方向。謝謝。 – MonkeyWrench

0

我設法解決了使用@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> 

它是由相同的變量驅動的賽義德的樣品在固定用長路徑。所以把這個目標放在那些已經可用的變量上。

P.S.這個技巧/黑客至少需要MSBuild v3.5,其中首次引入了元數據操作。

3

該包的前綴是由供給種類,範圍和性質匹配移除,如下所示:

"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