2010-11-19 14 views
6

最近Delphi 2006からDelphi 2007にアップグレードされ、プロジェクトファイルは.bdsprojから.dprojに変更されました。bdsprojをdprojに一括変換する方法は?

これまでの研究では、.dprojを作成するために、既存のプロジェクトをD2007 IDEで開く必要があることを示しています。我々は400以上の.bdsprojファイルを持っているので、これを手動で行うことは実際的ではありません。

find . -name *.bdsproj -exec bds.exe -pDelphi -ns -m "{}" ";" 

これは理想的ではありません、それはかなり遅いので(BDSロードするために、待つのコンパイルを待つ:

私が思いついたプロセスが使用してコマンドラインからすべてのプロジェクトを開くことでした起こる、BDSが閉じている間待つ...)。

複数の.bdsproj.dprojに効率的に変換する方法はありますか?

注:上記のコマンドラインの「find」は、ファイル内のテキストを検索するWindows findではなく、ファイルを検索するUNIX風の検索(例:MKSまたはGNU)です。

+2

悲しいことに、Embarcaderoにはその変換を行うためのコマンドラインツールはありません。 –

+0

bdsprojファイルとそれに対応するdprojファイルの文字の違いは何ですか?おそらくそれほど多くはないと思います。単純なプログラムがDelphiをロードすることなく一方を他方に変換できるほど似ていますか?そして、彼らはXMLですよね?私は単純なXSLTがすべてをすぐに変えることができると思っています。 –

+0

@Rob、私は彼らも似ていると思っていました。しかし、1つのXMLから別のXMLへの変換以上の違いがあります。各ファイルには、他のファイルにない情報が含まれています。例えば。 dprojにはdprからの情報とbdsprojからの情報が含まれ、UsePackagesの設定はbdsprojにあり、dprojではありません。それは私がかなり早く気づいた違いに過ぎず、おそらく他のものがあります。一度私はそれがまっすぐな変換ではなかったことを見て、私は探して停止した – WileCau

答えて

3

ここではPowerShellを使用したfindソリューションのより洗練されたバージョンです。指定されたディレクトリの下のファイルbdsprojを検索し、すべてのプロジェクトを含むbdsgroupを生成します。

スクリプトを実行した後、D2007を使用してbdsgroupを開き、プロジェクトをdprojに変換します。 D2007もgroupprojを生成します。これは、bdsgroupのD2007に相当するようです。

ヒント:

  • は、手順を参照して-helpでスクリプトを実行します。
  • bdsgroupを開く前にD2007を開始すると、プロジェクトをより迅速に処理するようです。
  • プロジェクトを保存する必要はありません。開くと、dprojが作成されます。

のおかげ:bdsgroupアプローチを示唆ため

ここにスクリプトがあります。それは私のために働く:o)

Param(
    $path = ".", 
    $exclude = "", 
    [switch]$help 
) 

Set-PSDebug -Strict 
$ErrorActionPreference = 'Stop' 

# Ensure path is fully qualified and ends with a path delimiter 
$path = Join-Path (Resolve-Path $path) "" 

# Output file full name ($path\scriptname.bdsproj) 
$outfile = Join-Path $path ([IO.Path]::ChangeExtension($MyInvocation.MyCommand.Name, "bdsgroup")) 

# Bdsgroup template 
$groupXml = [xml]@" 
<?xml version="1.0" encoding="utf-8"?> 
<BorlandProject> 
    <PersonalityInfo> 
     <Option> 
      <Option Name="Personality">Default.Personality</Option> 
      <Option Name="ProjectType"></Option> 
      <Option Name="Version">1.0</Option> 
      <Option Name="GUID">{$([guid]::NewGuid().ToString())}</Option> 
     </Option> 
    </PersonalityInfo> 
    <Default.Personality> 
     <Projects> 
      <Projects Name="Targets"></Projects> 
     </Projects> 
     <Dependencies/> 
    </Default.Personality> 
</BorlandProject> 
"@ 

### Functions ### 

function ShowUsage() 
{ 
    $myName = Split-Path -Leaf $MyInvocation.ScriptName 
    Write-Host "Usage:" 
    Write-Host "`t$myName [-path <Path>] [-exclude <Exclude>] [-help]" 
    Write-Host 
    Write-Host "`t-path <Path>" 
    Write-Host "`t`tSpecifies the directory to begin searching for *.bdsproj." 
    Write-Host "`t`tPath:" $path 
    Write-Host 
    Write-Host "`t-exclude <Exclude>" 
    Write-Host "`t`tSpecifies a directory to exclude from the search." 
    Write-Host "`t`tExclude:" $exclude 
    Write-Host 
    Write-Host "`t-help" 
    Write-Host "`t`tDisplays this message." 
    Write-Host 
    Write-Host "Output will be written to:" 
    Write-Host "`t" $outfile 
    Write-Host 
    Write-Host "Limitations:" 
    Write-Host "`tDoes not support multiple directories for Path or Exclude." 
} 

# Get the target name. 
# e.g. "D:\dev\src\foo.bdsproj" returns "foo.exe" 
function GetTarget($bdsproj) 
{ 
    $mainSource = GetMainSource($bdsproj) 
    $ext = GetTargetExt($mainSource) 
    Split-Path -Leaf ([IO.Path]::ChangeExtension($mainSource, $ext)) 
} 

# Get the relative project path. 
# e.g. If path is "D:\dev" then "D:\dev\src\foo.bdsproj" returns "src\foo.bdsproj" 
function GetProject($bdsproj) 
{ 
    $prefixLen = $path.Length 
    $suffixLen = $bdsproj.Length - $prefixLen 
    $bdsproj.Substring($prefixLen, $suffixLen) 
} 

# Get the fully qualified MainSource (dpr/dpk) path. 
# e.g. "D:\dev\src\foo.bdsproj" returns "D:\dev\src\foo.dpr" 
function GetMainSource($bdsproj) 
{ 
    $projXml = [xml](Get-Content $bdsproj) 
    $mainSource = $projXml.BorlandProject."Delphi.Personality".Source.Source | 
     Where-Object { $_.Name -eq "MainSource" } 

    $result = Join-Path (Split-Path -Path $bdsproj) $mainSource.InnerText 

    if (-not (Test-Path $result)) 
    { 
     throw "No MainSource (dpr/dpk) found for $bdsproj" 
    } 

    $result 
} 

# Get the target extension depending on the source type. 
function GetTargetExt($mainSource) 
{ 
    $targets = @{"package"="pkg"; "library"="dll"; "program"="exe"} 
    $targetType = GetTargetType($mainSource) 
    $targets[$targetType] 
} 

# Read the target type out of the dpr. 
function GetTargetType($mainSource) 
{ 
    $name = [IO.Path]::GetFileNameWithoutExtension($mainSource) 
    $pattern = "^\s*(package|library|program)\s+$name;$" 
    $matches = (Select-String -Path $mainSource -Pattern $pattern) 
    if ($matches -eq $null) 
    { 
     throw "Unknown target type (pkg/dll/exe) for $mainSource" 
    } 
    $matches.Matches[0].Groups[1].Value 
} 

# Add a project entry to groupXml. 
# e.g. <Projects Name="foo.exe">src\foo.bdsproj</Projects> 
function AddProject($target, $project) 
{ 
    $node = $groupXml.CreateElement("Projects") 
    $node.SetAttribute("Name", $target) 
    $node.InnerText = $project 
    $groupXml.BorlandProject."Default.Personality".Projects.AppendChild($node) | Out-Null 

    $targets = $groupXml.BorlandProject."Default.Personality".Projects.Projects | 
     Where-Object { $_.Name -eq "Targets" } 
    $targets.InnerText = $targets.InnerText + " " + $target 
} 

### Main ### 

if ($help) 
{ 
    ShowUsage 
} 
else 
{ 
    Get-ChildItem -Path $path -Include "*.bdsproj" -Recurse | 
    Where-Object { $exclude -eq "" -or $_.FullName -notmatch $exclude } | 
    ForEach-Object { AddProject (GetTarget $_.FullName) (GetProject $_.FullName) } 

    $groupXml.OuterXml | Out-File -Encoding "UTF8" $outfile 
} 
3

複数のプロジェクトを同時に開くことができます。ドラッグアンドドロップを使用しています。

  • セレクト40件のプロジェクトIDEへ
  • ドラッグし、それらを
  • [はい]をクリックして40倍
  • 保存近いすべて
  • 終了するまで、すべての
  • 繰り返します。
+1

一度の作業で十分に効率的です。 –

+0

限定:プロジェクトグループ内の重複したプロジェクト名は許されません - 私はここで 'Unittests'のようなプロジェクト名を使用して残念です。 – mjn

2

find(おそらく少しのDelphiのプログラム)と同様のコマンドラインを使用して、すべてのプロジェクトで* .bdsgroupファイルを作成し、それをD2007で開くことができます。

関連する問題