Как конвертировать bdsproj в dproj? - PullRequest
6 голосов
/ 19 ноября 2010

Недавно мы обновились с Delphi 2006 до Delphi 2007, и файлы проекта изменились с .bdsproj на .dproj.

Мои исследования пока показывают, что для создания .dproj существующийПроект должен быть открыт в IDE D2007.У нас более 400 .bdsproj файлов, поэтому делать это вручную не очень удобно.

Процесс, который я придумал, состоял в том, чтобы открыть все проекты из командной строки, используя:

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

Это не идеально, потому что это довольно медленно (дождитесь загрузки BDS, дождитесь завершения компиляции, дождитесь закрытия BDS, ...).

Существует ли эффективный способ преобразования нескольких .bdsprojto .dproj?

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

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

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

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

Подсказки:

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

Спасибо:

Вот сценарий.У меня это работает: о)

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 голосов
/ 19 ноября 2010

Вы можете открыть несколько проектов одновременно.Даже используя перетаскивание.

  • Выберите 40 проектов
  • Перетащите их в IDE
  • Нажмите "Да" 40 раз
  • Сохранить все
  • закрыть все
  • Повторяйте до конца.
2 голосов
/ 19 ноября 2010

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

...