この問題も発生しました。絶対パスを使用したかったのは、各デプロイメントでPackagesフォルダが別々の場所に作成された(複数のビルドマシンもあるため)。そのアイデアは、1つの場所にNuGetパッケージを置くことでした。これは、無駄なメモリが同じものの複数のコピーを持たないようにします。
私たちの具体的な問題は、NuGet.Configファイルに絶対パスを設定できることでした.NuGetパッケージは展開時にその場所に復元されますが、MSBuildのステップではすべて見つかりませんでした。同じ展開。
この問題を解決するためのPowerShellスクリプトを作成しました。基本的には、相対パスのHintPath参照を、使用したい絶対パスに置き換えます。
#Get list of all csproj files in a solution
$dir = Get-ChildItem $pwd -Recurse
$list = $dir | Where {$_.extension -eq ".csproj"}
#Replace relative paths with absolute path
$absolutePath = 'C:\absolute\path\Packages'
function replaceRelativePath($line){
if($line -match '<HintPath>[^C].+\\Packages')
{
$relative = $matches[0] -replace '\\','\\'
return ($line -replace "$relative", "<HintPath>$absolutePath")
}
else
{
return $line
}
}
#Updating files
Foreach($file in $List)
{
(Get-Content $file.FullName)| ForEach-Object{replaceRelativePath($_)} | Set-Content $file.FullName
}
このスクリプトは、展開時にMSBuildが実行される前にPowerShellビルドステップとして実行するように設定しました。その結果、csprojファイルはビルドマシン上の作業ディレクトリに対して変更されますが、Visual Studioソース管理では変更されません。 (ソース管理で変更したい場合は、おそらくこれをPowerShellで実行して変更をチェックすることができます)。
非相対パスを使用する目的は何ですか?私はSpecialFolderを含むパスが必要だと理解できますが、完全にハードコーディングされたパスはシステム間で柔軟性がありません。 – STW
@ Yoooderあなたは、スタジオが好きな陽気な相対的な経路を見ていない、それはハードコードされているかもしれません。私はそれらを見たことがあります.. \ .. \自分自身がすべてルートになってからターゲットフォルダに戻ってしまいました。 – hova
私はこれを探していました。どうして?私は長年にわたり、さまざまなバージョンのアプリケーションの変更を壊すことから回復するいくつかの拡張メソッドを持っています。 AutoDeskありがとうございました。待って、いいえ。これらの拡張メソッドはすべての私のアプリで普遍的です。 AutoCADの矛盾を修正したり変更したりする必要があるため、私のマシン上のすべてのアプリケーションにパッチを適用する必要はありません。私は1つの場所でそれを修正したい。これを行う唯一の他の元気な方法は、ローカルNugetサーバーを使用することです。大過剰ですか? –