2016-07-21 11 views
1

Ich muss CopyLocal bis false für jede Baugruppe meines NuGet-Pakets festlegen. Ich mache es in der Install.ps1 Datei:Wie kann ich den Teilstring der .net-Version erhalten, anstatt direkt auf die `net35`-Zeichenfolge im` Install.ps1`-Skript zu zeigen?

param($installPath, $toolsPath, $package, $project) 

$asm_folder = [System.IO.Path]::Combine($installPath, "lib\\net35"); 

$files = [System.IO.Directory]::EnumerateFiles($asm_folder,"*.dll","TopDirectoryOnly"); 

$array = New-Object System.Collections.ArrayList; 

foreach ($file in $files) { 
    $file_name = [System.IO.Path]::GetFileNameWithoutExtension($file); 
    $array.Add($file_name); 
} 

foreach ($reference in $project.Object.References) { 

    if($array.Contains($reference.Name)) { 

     if($reference.CopyLocal -eq $true) { 
      $reference.CopyLocal = $false; 
     } 
     else { 
      $reference.CopyLocal = $true; 
     } 
    } 
} 

Wie kann ich die Teilzeichenfolge von .net-Version (des Zielprojekts) anstelle des net35 Zeichenfolge im Install.ps1 Skript direkt zeigen?

Antwort

0

Sie müssen Verzeichnisse im Verzeichnis lib lesen und sehen, welche anderen Versionen es dort gibt. Wie folgt aus:

Get-ChildItem $installPath -Recurse:$false -Filter 'net*' |?{ $_.PSIsContainer } 

Changed Ihr Skript ein wenig:

param($installPath, $toolsPath, $package, $project) 

#here you get the list of NET% folders 
$net_folders = @(Get-ChildItem $installPath -Recurse:$false -Filter 'net*' |?{ $_.PSIsContainer }) 

#then you looking for every 'net' folder for .dll files 
$files = @() 
foreach ($net_folder in $net_folders){ 
    $files += @(Get-ChildItem $net_folders -Recurse:$false -Filter '*.dll' | Select @{l='FullName';e={[System.IO.Path]::GetFileNameWithoutExtension($_.FullName)}}| Select -Expand FullName) 
} 

foreach ($reference in $project.Object.References) { 
    if($files.Contains($reference.Name)) { 
     #since you are setting copylocal to true anyway you wont need if/else statement 
     $reference.CopyLocal = $true; 
    } 
} 
+0

Aber ich möchte nur suchen, 'net'-Ordner, der dem Zielprojekt entspricht, statt Iteration durch alle' net'-Ordner. –

+0

Ersetzen Sie $ referenz.CopyLocal = $ true; 'to $ reference.CopyLocal = $ false;'. Dein Code setzt 'CopyLocal' für' fals' nicht, auch wenn dieser Ersatz durchgeführt wurde. –

0

Meine Entscheidung für mich nicht angenehm, aber es funktioniert:

<# 
Install.ps1 
AutoCAD-YYYY.Net.* NuGet package. 

© Andrey Bushman, 2016 
https://www.nuget.org/profiles/Bush 

This PowerShell script will be launched by NuGet each time when 
this package will be installed into the Visual Studio project. 

This script sets `CopyLocal` to `false` for each AutoCAD assembly. 
#> 
param($installPath, $toolsPath, $package, $project) 

$asm_root_folder_name = [System.IO.Path]::Combine($installPath,` 
"lib"); 

$net_folders = [System.IO.Directory]::GetDirectories(` 
$asm_root_folder_name, 'net*', 'TopDirectoryOnly'); 

$file_names = New-Object ` 
'System.Collections.Generic.HashSet[string]'; 

foreach ($net in $net_folders) { 

    $files = [System.IO.Directory]::EnumerateFiles($net,"*.dll"` 
    ,"TopDirectoryOnly"); 

     foreach ($file in $files) { 

      $file_name = [System.IO.Path]::` 
      GetFileNameWithoutExtension($file); 

      $file_names.Add($file_name); 
    } 
} 

foreach ($reference in $project.Object.References) { 

    if($file_names.Contains($reference.Name)) { 

     $reference.CopyLocal = $false; 
    } 
}