2010-11-19 5 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?

Примечание: «Найден» в приведенной выше командной строке является UNIX-подобным поиском (например, MKS или GNU), который ищет файлы, а не поиск Windows, который ищет текст в файлах.

+2

Удовлетворительно, что у Embarcadero нет инструмента командной строки, доступного для этого преобразования. –

+0

Какова текстовая разница между файлом bdsproj и его соответствующим файлом dproj? Наверное, не так много, я бы ожидал. Являются ли они достаточно похожими на то, что простая программа может конвертировать один в другой, не загружая Delphi? И это XML, верно? Я думаю, что простой XSLT может преобразовать всю игру сразу. –

+0

@ Rob, я думал, что они тоже будут похожи, и в некотором смысле они есть. Но есть различия, которые делают это больше, чем просто перевод из одного XML в другой. Каждый файл содержит информацию, которая не находится в другой. Например. dproj содержит информацию от dpr, а также от bdsproj, а параметр UsePackages в bdsproj - это не dproj. Это лишь те различия, которые я заметил довольно быстро, возможно, другие. Как только я увидел, что это не было прямой конверсией, я перестала смотреть. – WileCau

ответ

3

Приведен: более подходящий вариант решения find с использованием PowerShell. Он ищет файлы bdsproj в указанном каталоге и создает bdsgroup, содержащий все проекты.

После запуска сценария откройте bdsgroup с D2007, чтобы преобразовать проекты в dproj. D2007 также производит groupproj, который представляется эквивалентом D2007 от bdsgroup.

Подсказки:

  • Запуск сценария с -help, чтобы увидеть инструкции.
  • Запустите D2007 перед тем, как открыть bdsgroup, кажется, что процесс выполняется быстрее.
  • Вам не нужно сохранять проекты, открывая их, чтобы создать dproj.

Благодаря:

  • Ulrich Gerhardt предложившего bdsgroup подход.
  • dangph для справки по сценарию PowerShell.

Вот сценарий. Это работает для меня: 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 проектов
  • Перетащите их в интегрированную среду разработки
  • Нажмите да 40 раз
  • Сохранить все
  • закрыть все
  • Повторяйте, пока не закончил.
+1

Кажется достаточно эффективным для одноразовой задачи. –

+0

только ограничение: дублировать названия проектов в группе проекта не допускаются - я сожалею, что использовал названия проектов, такие как «Unittests» здесь и там, IDE продолжает звучать на мне;) – mjn

2

Может быть, вы могли бы использовать командную строку, подобную вашей find (и, возможно, немного Delphi программе), чтобы создать * .bdsgroup файл со всеми проектами и открыть, что в D2007.

Смежные вопросы