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