2012-10-05 103 views
1

每次構建解決方案時,我都必須製作源代碼的壓縮zip文件。 我試着做this,因此該項目的屬性頁面上我對「生成後事件」文本框驗證碼:構建後壓縮源代碼

if $(ConfigurationName)==Release 
    xcopy /df $(ProjectDir)$(TargetName)*.cs $(ProjectDir)$(TargetName)Source.zip 
if $(ConfigurationName)==Release 
    xcopy /df $(TargetDir)$(TargetName)$(TargetExt) $(ProjectDir)$(TargetName)Runtime.zip 

,但它不工作。

它說,

Error 1 The command "if ==Release xcopy /df *.csSource.zip 
      if ==Release xcopy /df Runtime.zip 
      " exited with code 255. c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets 3717 9 BuildEventHooks 

我怎樣才能使它發揮作用?我正在使用Visual Studio 2010和.NET 4(MSBuild 4)

+0

我看它不承認它。但爲什麼?在宏窗口上我有ConfigurationName宏。 另外,如果xcopy不這樣做,我該如何壓縮源代碼? 這是什麼內置命令? – Zsolt

+0

你是否真的想讓每個構建花費更多時間?你想達到什麼目的? –

+0

我必須在構建服務器上的每個構建版本的源代碼中創建一個zip文件。這是必需的,因爲源代碼包含我們想要提供給其他開發人員開發他們自己的插件的插件。 – Zsolt

回答

0

在這種情況下,使用像SVN或GIT這樣的像樣的源代碼控件。兩者都提供了創建「外部」的能力,這將解決您的問題。

你的想法似乎很奇怪,因爲構建時間會大大增加。這就是說,如果你想允許創建插件,在自定義DLL中隔離你的插件契約(可能是一個接口)並且發佈這個DLL。爲什麼你需要發佈源代碼來創建一個可組合的應用程序?

最後,FYI,xcopy不會壓縮文件。您可以使用7zip.exe或類似的壓縮工具,或者創建一個參數化的powershell腳本,您可以在後期製作事件中觸發。該腳本可以包含您期望的壓縮。

下面是一個簡單函數,可以壓縮內容:

function Compress-Directory 
{ 
    [CmdLetBinding()] 
    param(
     [Parameter(Mandatory=$true)] 
     [string] 
     $SourceDirectory, 
     [Parameter(Mandatory=$true)] 
     [string] 
     $Target, 
     [ValidateSet("Auto", "Cab", "Zip")] # Supported formats : Cab or Auto for infering the format from the file extension 
     [string] 
     $Format = "Auto", 
     [Switch]$Force 
    ) 
    process{ 

     if($Format -Match "auto") { 
      switch([System.IO.Path]::GetExtension($Target).ToLower()) 
      { 
       ".cab" { $Format = "Cab" } 
       ".zip" { $Format = "Zip" } 
       default { throw "Could not infer the kind of archive from the target file name. Please specify a file name with a known extention, or use the 'Format' parameter to specify it" } 
      } 
     } 

     if(Test-Path($Target)) 
     { 
      if($Force) { 
       Write-Verbose "Deleting existing archive $Target" 
       Remove-Item $Target -Force 
       Write-Verbose "Deleted existing archive $Target" 
      }else{ 
       throw "The target file '$Target' already exists. Either delete it or use the -Force switch" 
      } 
     } 

     switch($Format) { 
      "Cab" { 
       [void][reflection.assembly]::LoadFile((Join-Path $PSScriptRoot "CabLib.dll")) 

       ## the cablib dll can be downloaded from http://wspbuilder.codeplex.com 
       $c = new-object CabLib.Compress 
       $c.CompressFolder($SourceDirectory, $Target, $null, $null, $null, 0) 
       ## thanks to http://www.pseale.com for this function 
      } 
      "Zip" { 
       Get-ChildItem $SourceDirectory | Compress-ToZip $Target 
      } 
      default { throw "No compress method known for $Format files."} 
     } 
    } 
} 

function Compress-ToZip { 
    param([string]$zipfilename) 

    Write-Host "Creating the archive $zipfilename" 

    if(-not (test-path($zipfilename))) { 
     set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
     (Get-ChildItem $zipfilename).IsReadOnly = $false 
    } 

    $shellApplication = new-object -com shell.application 
    $zipPackage = $shellApplication.NameSpace($zipfilename) 

    foreach($file in $input) { 
     $zipPackage.CopyHere($file.FullName)  
     $size = $zipPackage.Items().Item($file.Name).Size 
     Write-Host "Adding $file" 
     while($zipPackage.Items().Item($file.Name) -Eq $null) 
     { 
      start-sleep -seconds 1 
      write-host "." -nonewline 
     } 
     write-host " Done" -ForegroundColor Green 
    }  

    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($zipPackage) | out-Null 
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($shellApplication)| out-Null 
} 
+0

我們使用TFS。 我認爲可以很容易地定義一個後期構建腳本,它可以在構建服務器上運行,而不是在本地機器上運行。 來源不是太大,因此生成檔案應該很快。 我們必須提供樣品來源來支持我們的合作伙伴。 – Zsolt

+0

我看到你已經編輯了你的答案。感謝這個功能!我會看看它,但目前我正在考慮可能有一個TFS構建目標,它可以壓縮Team Foundation Server上的文件。 – Zsolt

+0

我想我會以更具體的格式重新發布這個問題。 – Zsolt