2010-11-19 32 views
6

Gần đây chúng tôi đã nâng cấp từ Delphi 2006 lên Delphi 2007 và các tệp dự án đã thay đổi từ .bdsproj thành .dproj.Làm thế nào để chuyển đổi hàng loạt bdsproj thành dproj?

Nghiên cứu của tôi cho đến nay chỉ ra rằng để tạo .dproj, một dự án hiện có cần được mở trong IDE D2007. Chúng tôi có hơn 400 .bdsproj tệp để thực hiện việc này theo cách thủ công không thực sự thực tế.

Quá trình tôi đã đưa ra là để mở tất cả các dự án từ dòng lệnh sử dụng:

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

Đây không phải là lý tưởng vì nó là khá chậm (chờ BDS để tải, chờ biên dịch để xảy ra, chờ trong khi BDS đóng, ...).

Có cách nào hiệu quả để chuyển đổi nhiều .bdsproj thành .dproj không?

Lưu ý: 'Tìm' trong dòng lệnh trên là tìm kiếm giống UNIX (ví dụ: MKS hoặc GNU) tìm kiếm tệp chứ không phải Windows tìm kiếm tìm kiếm văn bản trong tệp.

+2

Buồn rằng Embarcadero không có sẵn công cụ dòng lệnh để thực hiện chuyển đổi đó. –

+0

Sự khác biệt về văn bản giữa tệp bdsproj và tệp dproj tương ứng của nó là gì? Có lẽ không nhiều, tôi mong đợi. Họ có đủ tương tự mà một chương trình đơn giản có thể chuyển đổi một cái khác mà không cần phải tải Delphi? Và chúng là XML, đúng không? Tôi nghĩ một XSLT đơn giản có thể biến đổi rất nhiều cùng một lúc. –

+0

@Rob, tôi nghĩ chúng cũng sẽ giống nhau và theo một số cách. Nhưng có những khác biệt làm cho nó không chỉ là một bản dịch từ một XML sang một XML khác. Mỗi tệp chứa thông tin không có trong phần còn lại. Ví dụ. dproj chứa thông tin từ dpr cũng như từ bdsproj và cài đặt UsePackages nằm trong bdsproj không phải là dproj. Đó chỉ là những khác biệt mà tôi nhận thấy khá nhanh, có lẽ những người khác. Một khi tôi nhìn thấy nó không phải là một chuyển đổi thẳng tôi ngừng nhìn. – WileCau

Trả lời

3

Đây là phiên bản hấp dẫn của giải pháp find sử dụng PowerShell. Nó tìm kiếm các tệp bdsproj trong một thư mục được chỉ định và tạo ra một bdsgroup chứa tất cả các dự án.

Sau khi tập lệnh được chạy, hãy mở bdsgroup bằng D2007 để chuyển đổi các dự án thành dproj. D2007 cũng sản xuất groupproj, có vẻ như tương đương với D2007 là bdsgroup.

Gợi ý:

  • Chạy tập lệnh có -help để xem hướng dẫn.
  • Bắt đầu D2007 trước khi mở bdsgroup, có vẻ như xử lý các dự án nhanh hơn.
  • Bạn không cần phải lưu các dự án, mở chúng là đủ để tạo ra dproj.

Nhờ:

  • Ulrich Gerhardt cho thấy cách tiếp cận bdsgroup.
  • dangph để được trợ giúp về tập lệnh PowerShell.

Đây là tập lệnh. Nó hoạt động cho tôi: 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

Bạn có thể mở nhiều dự án cùng một lúc. Ngay cả khi sử dụng kéo và thả.

  • Chọn 40 dự án
  • Kéo họ IDE
  • Bấm có 40 lần
  • Lưu tất cả
  • đóng tất cả
  • Lặp lại cho đến khi kết thúc.
+1

Dường như đủ hiệu quả cho tác vụ một lần. –

+0

chỉ giới hạn: tên dự án trùng lặp trong một nhóm dự án không được phép - Tôi rất tiếc khi sử dụng tên dự án như 'Unittests' ở đây và ở đó, IDE tiếp tục thổi vào tôi;) – mjn

2

Có thể bạn có thể sử dụng dòng lệnh tương tự như find (và có thể là một chương trình Delphi nhỏ) để tạo tệp * .bdsgroup với tất cả các dự án và mở trong D2007.

Các vấn đề liên quan