2011-03-15 15 views
4

我想製作一個自動化的powershell腳本,它報告項目的參考和參考路徑。 當.csproj中的hintpath未被填充時,我無法找到獲取引用路徑的方法。如何通過* .csproject文件找到參考路徑

+0

我可能是錯的,但我相信,暗示路徑中的csproj文件的唯一路徑。如果未填充,我希望編譯器在GAC和其他常用文件夾(如bin)中查找以查找引用。在那裏我相信如果提示路徑沒有被填充,它就根本找不到。 – 2011-03-15 15:10:02

+0

當然,您可以查看將要搜索的常用文件夾 - 如項目中的bin /和系統文件夾。然而,要問的更好的問題是*爲什麼*你想要這個?你需要什麼路徑? – 2011-03-15 15:13:43

+0

有一些引用沒有用hintpath列出,但不在GAC中,但構建服務仍然可以找到它們。例如telerik dll的。這很煩人,因爲我基於自己添加的dll被列出了一條提示路徑的事實,但它似乎並非全部都是。 – woutvdd 2011-03-15 15:14:46

回答

2

這是一個快速解決方案。它抓取當前目錄下的每個.csproj文件,並檢查每個引用。對於從GAC引用的程序集,只輸出名稱。對於GAC外的裝配,輸出裝配的完整路徑。

$projectFiles = get-childitem . *.csproj -Recurse 

foreach($projectFile in $projectFiles) 
{ 
    $projectXml = [xml] (get-content $projectFile.FullName) 
    $projectDir = $projectFile.DirectoryName 

    Write-Host "# $($projectFile.FullName) #" 


    foreach($itemGroup in $projectXml.Project.ItemGroup) 
    { 
     if($itemGroup.Reference.Count -eq 0) 
     { 
      continue 
     } 

     foreach($reference in $itemGroup.Reference) 
     { 
      if($reference.Include -eq $null) 
      { 
       continue 
      } 

      if($reference.HintPath -eq $null) 
      { 
       Write-Host ("{0}" -f $reference.Include) 
      } 
      else 
      { 
       $fullpath = $reference.HintPath 
       if(-not [System.IO.Path]::IsPathRooted($fullpath)) 
       { 
        $fullPath = (join-path $projectDir $fullpath) 
        $fullPath = [System.IO.Path]::GetFullPath("$fullPath") 
       } 
       Write-Host $fullPath 
      } 
     } 
    } 

    Write-Host '' 
} 

注意,默認情況下,有一些的MSBuild看起來找到沒有暗示路徑引用的位置,一些註冊表項。你能看到的MSBuild的外觀和它由具有詳細記錄編譯定位程序集的開啓:

msbuild My.csproj /t:build /v:d 
+0

感謝您的腳本,但是我們可以假設,當沒有填入任何hintpath時,文件就位於在GAC中? 由於Telerik dlls不在GAC中,並且沒有提示路徑 – woutvdd 2011-03-16 08:34:29

+0

Telerik DLL的Reference元素的外觀如何? – 2011-03-16 15:15:06

+0

woutvdd 2011-03-17 09:59:52

0

一個(hacky)解決方案可以確保所有引用都將「Copy Local」設置爲true。這樣,任何dll引用將總是結束在/ bin目錄,因此你有一個路徑。

但是,如果意圖是將所有引用的程序集都放在一個地方,那麼根據環境的其餘部分,甚至可以將GAC中存在的引用複製到本地副本也可能沒有意義。