1

ソリューションをビルドするたびに、ソース コードの圧縮 zip ファイルを作成する必要があります。私はこれをやろうとしたので、プロジェクトのプロパティページで、「ビルド後のイベント」テキストボックスに次のコードがあります:

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) を使用しています

4

1 に答える 1

0

この場合、SVN や GIT などの適切なソース管理を使用してください。どちらも、問題を解決する「外部」を作成する機能を提供します。

ビルド時間が大幅に増加するため、あなたのアイデアは非常に奇妙に思えます。

つまり、プラグインの作成を許可したい場合は、カスタム DLL でプラグイン コントラクト (おそらくインターフェイス) を分離し、この DLL を出荷します。構成可能なアプリケーションを作成するためにソース コードを出荷する必要があるのはなぜですか?

最後に、参考までに、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
}
于 2012-10-05T12:33:27.683 に答える