visual studio - MSBuildディレクトリ構造制限の回避策



visual-studio command-line (6)

DOSパスを試しましたか? または\\?\プレフィックス? .NET BCLチームのブログにはより多くの情報があります。

https://ffff65535.com

Visual StudioプロジェクトとソリューションをコマンドラインからビルドするためのMSBuildツールの260文字制限を克服する方法はありますか? 私はCruiseControlを使ってビルドを自動化しようとしています(CruiseControl.NETはオプションではありませんので、通常のantスクリプトに入れようとしています)、パスの長さに問題があります。 明確にするために、問題は、ツールがパスを適切に縮小しないので、ソリューションファイルで参照されるプロジェクトのパスの長さにあります。

私はDevEnvを使って試してみましたが、時にはうまく動作しません。また例外をスローすることもあります。これは別のマシン上の自動ビルドには適していません。 ですから、これを代替品として使用することはお勧めしません。

そして、それをすべて上手くいくためには、通常のIDEを使ってVisual Studioを使用するときにプロジェクトがうまく構築されます。


MSBuildの限界だと思われます。 私たちは同じ問題を抱えていました。結局、適切に機能する他の解決策が見つからなかったため、パスを短縮する必要がありました。


ビルドに関連する長いパスの問題には2種類あります。 1つは本当に長すぎず、たくさんの ".. \"があるパスです。 通常、これは参照のHintPath値です。 MSBuildは、これらのパスを最大限度以下に正規化して動作させる必要があります。

他の種類のパスは、あまりにも長すぎます。 申し訳ありませんが、これらは機能しません。 それを見てみると、問題は、長いパスに対して十分なAPIサポートがないことです。 BCLチーム(ブログ参照)にも同様の問題がありました。 いくつかのWin32 APIだけが\?\形式をサポートしています。 任意のビルドツール、おそらくそこのアプリケーションの98%はそうではありません。 MAX_PATHのためにサイズが決められたすべてのバッファを考えれば、ひどく振る舞うでしょう。

我々は長い道のりを作るための大きなエコシステム努力が行われるまで、またはWindowsはとにかく(短い経路のマングリングのように)それらを働かせるためのいくつかの巧妙な方法を思いつきます。長い道のりはMSBuildがサポートできないという結論に達しました。 回避策には、見つかったsubstが含まれています。 しかしあなたのツリーが単に深すぎると、あなたの唯一の選択肢は断片的にそれを構築したり、フォルダ名を短くすることです。 ごめんなさい。

ダン/ MSビルド


私は、C#コンパイラ(csc.exe)が呼び出されたときに、プロジェクトディレクトリのパスPROJECTDIRECTORYと出力パスOUTPUTPATHを単に次のように追加して使用するという問題を発見しました。

PROJECTDIRECTORY + OUTPUTPATH

しかし、OUTPUTPATHが相対的な場合(つまり、 ".. \ .. \ Build \ ProjectName \ AnyCPU_Debug_Bin \")、プロジェクトディレクトリがかなり長い場合、パスは次のようになるため、全長は259文字より長くなります。

PROJECTPATH + ".. \ .. \ Build \ ProjectName \ AnyCPU_Debug_Bin \"

絶対パスの代わりに。

csc.exeがWin32関数を呼び出す前に絶対パスを作成すると、これは機能します。 私たちの場合、絶対パスの長さは160文字未満です。

なんらかの理由で、Visual Studioからのcsc.exeへの呼び出しは、MSBuildとVisual Studioからの呼び出しとは異なります。 なぜだか分からない。

どちらの場合も、PROJECTDIRECTORYパスおよび/またはOUTPUTPATHパスのいずれかまたは両方を変更することで問題を解決できます。


パスの長さが260の場合、このエラーの259または261が発生しないため、警告解決参照があります。 私はmsbuildのバグがあると思う。


私は既に回答があることは承知していますが、同じエラー出力を与えたmsbuildmsbuildしているときに別の問題があり、私を循環する野生のガチョウの追跡に導いてくれました。 今後のGoogle社員にとっては、次のようになります。

msbuildを呼び出すバッチファイルがありますが、ビルドマシンがVisual Studioの複数のバージョン用にビルドできるように、各バッチファイルはvcvarsall.batする前にvcvarsall.bat呼び出しmsbuild 。 これは、何度も何度も何度も同じように完全なパスを詰め込むという厄介な副作用があります。 いっぱいになると、上の質問のエラーが表示されますThe input line is too long. シンプルなGoogle検索では、あなたのパスがmsbuildにとって突然長すぎると思うかもしれません。

私の場合、 cmd.exeのセッションを終了して再起動するのと同じくらい簡単なので、環境変数を元の状態に戻しました。





msbuild