読者です 読者をやめる 読者になる 読者になる

SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

BJDのバージョン更新(F#)


先日作成したZipファイル作成の部分を使用して、BJD更新時に行う定型処理をF#で書いてみました。

主な、作業は、下記のとおりです。

(1) バイナリのzipファイル作成
(2) ソースコードのZipファイル作成
(3) msiファイルの名前変更

この作業で、bjd-5.3.3.zip bjd-src-5.3.3.zip bjd-5.3.3.msiが出来上がるという感じです。

まだ、ぜんぜん理解できていないF#なんですが・・・・書いているうちに少しはなれるかな?

ちなみに、open Ionic.Zipのような参照DLLは、拡張子fsxでは使用できないのですね?


open System
open System.IO
open Ionic.Zip


//ディレクトリのコピー
let rec DirectoryCopy (src,dst) = 
    let srcInfo = new DirectoryInfo(src);
    let dstInfo = new DirectoryInfo(dst);

    //コピー先のディレクトリがなければ作成する
    if (not dstInfo.Exists) then 
        dstInfo.Create();
        //dstInfo.Attributes <= srcInfo.Attributes;
    //ファイルのコピー
    for f in srcInfo.GetFiles() do 
        //同じファイルが存在していたら、常に上書きする
        f.CopyTo(dst + "" + f.Name, true) |> ignore
    
    //ディレクトリのコピー(再帰を使用)
    for d in srcInfo.GetDirectories() do 
        DirectoryCopy(d.FullName,dst + "" + d.Name)

// BJD-Version.zip用のファイルのコピー
let CopyBin(src_base,dst_base) =

    let srcDir = sprintf "%sBJDout" src_base
    let dstDir = sprintf "%sBlackJumboDog" dst_base

    //dstDirが存在しない場合は、作成する
    if not (Directory.Exists(dstDir)) then Directory.CreateDirectory(dstDir) |> ignore

    //************************************************
    //ファイルコピー
    //************************************************
    for f in ["BJD.exe";"example.pfx";"named.ca";"BJD.exe.config"] do
        let src = sprintf "%s%s" srcDir f
        let dst = sprintf "%s%s" dstDir f
        if not (File.Exists(dst)) then File.Copy(src,dst)

    //************************************************
    //DLLコピー
    //************************************************
    for f in  ["Dhcp";"Dns";"Ftp";"Pop3";"ProxyFtp";"ProxyHttp";"ProxyPop3";"ProxySmtp";"ProxyTelnet";"Remote";"Smtp";"Tftp";"Tunnel";"Web"] do
        let src = sprintf "%s%sServer.dll" srcDir f
        let dst = sprintf "%s%sServer.dll" dstDir f
        if not (File.Exists(dst)) then File.Copy(src,dst)


    printfn "Finish CopyBin() %s" dstDir

// bjd-src-Version.zip用のファイルのコピー
let CopySrc(src_base,dst_base) = 

    let srcDir = sprintf "%s" src_base
    let dstDir = sprintf "%ssrc" dst_base

    //dstDirが存在しない場合は、作成する
    if not (Directory.Exists(dstDir)) then Directory.CreateDirectory(dstDir) |> ignore

    //************************************************
    //ファイルコピー
    //************************************************
    for n in ["BJD.sln"] do
        let src = srcDir + "" + n
        let dst = dstDir + "" + n
        if not (File.Exists(dst)) then File.Copy(src,dst)
    //************************************************
    //ディレクトリコピー
    //************************************************
    for n in  ["BJD";"BJDTest";"WebServerTest";"FtpServerTest";"Setup";"SetupFiles";
                "DhcpServer";"DnsServer";"FtpServer";"Pop3Server";
                "ProxyFtpServer";"ProxyHttpServer";"ProxyPop3Server";
                "ProxySmtpServer";"ProxyTelnetServer";"RemoteServer";
                "SmtpServer";"TftpServer";"TunnelServer";"WebServer"] do
        let src = srcDir + n
        let dst = dstDir + n
        DirectoryCopy (src,dst)

        //余分なディレクトリは削除する
        for n in ["obj";"out";"bin";"Debug";"Release"] do
            let f = dst + "" + n
            if(Directory.Exists(f)) then 
                Directory.Delete(f,true)

    printfn "Finish CopySrc() %s" dstDir

//Zipファイルへの追加
let rec append(zip:ZipFile,dir,offset) = 
    for f in Directory.GetDirectories(dir) do
        append(zip,f,offset)//ディレクトリがある場合は再帰で処理する
    for f in Directory.GetFiles(dir) do
        let v = f.Substring(offset);
        printfn "Adding %s..." v
        zip.AddFile(f,v) |> ignore


//Zipファイルへの作成
let CreateZip(dir,file,dst:string)=
    let src = sprintf "%s%s" dir file
    
    //既に存在する場合は削除する
    if (File.Exists(dst)) then File.Delete(dst)

    //Zipファイルの生成
    let zip = new ZipFile()
    append(zip,src,dir.Length)
    zip.Save(dst)
    printfn "Finish CreateZip() %s" dst

// Setup.msi のコピー
let CopyMsi(src_base,dst_base,ver)=
    let src = sprintf "%sSetupDebugSetup.msi" src_base
    let dst = sprintf "%sbjd-%s.msi" dst_base ver
    if not (File.Exists(dst)) then File.Copy(src,dst)
    printfn "Finish CopyMsi() %s" dst   
    

//***************************************************
// Main
//***************************************************

let ver = "5.3.3"//作成するバージョン
let src_base = "X:SRCBJD" //コピー元の基準フォルダ
let dst_base = "D:tmp" //コピー先の基準フォルダ

CopyBin(src_base,dst_base)
CopySrc(src_base,dst_base)
CreateZip(dst_base,"BlackJumboDog",sprintf "%sbjd-%s.zip" dst_base ver)
CreateZip(dst_base,"src",sprintf "%sbjd-src-%s.zip" dst_base ver)
CopyMsi(src_base,dst_base,ver) 

printfn "Hit any Key"
Console.ReadKey(true)|>ignore