web-dev-qa-db-ja.com

ファイルパスが長すぎるためにウェブサイトの公開が失敗する

私は、そのファイルのいくつかへの途方もなく長いパスを持つベンダーからのWebサイトプロジェクトを公開しようとしています。公開時のエラーは次のとおりです。

The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

パブリッシュするとき、Visual Studio 2012 Update 3は一時ディレクトリへの書き込みを試みますが、プレフィックスは非常に長くなります。

 C:\Users\cuser\AppData\Local\Temp\WebSitePublish\MidasCMS400v9-1580334405\obj\Debug\Package\PackageTmp\

次のSO回答に従って、VSをc:\temの別の一時ディレクトリにリダイレクトできると考えました: Webサイトプロジェクトを公開するときに一時パスが長すぎます

パブリケーションプロファイルを作成し、それを開くとすぐに、WebPublishMethodPropertyGroupの要素ではないことを示すエラーが発生します。とにかく、私はこのように見えるようにファイルを更新しました:

<Project ToolsVersion="4.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\Sites\MidasPublish</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
    <AspnetCompileMergeIntermediateOutputPath>c:\tem\</AspnetCompileMergeIntermediateOutputPath>
  </PropertyGroup>
</Project>

発行しようとすると、「ファイル変更が検出されました」というタイトルのモーダルボックスポップアップが表示され、「プロジェクトYourWebsiteは環境外で変更されました」というメッセージが表示されます。エラーリストでは、特定したc:\temディレクトリを使用しようとしていないため、パスが長すぎるというエラーが引き続き表示されます。

この血なまぐさいものをサーバーに置く必要があります。血なまぐさいものを公開できるようにするための解決策が必要です。ウェブサイトプロジェクトテンプレートについてあまり知りませんので、もっと良い方法があれば教えてください。

29
Mister Epic

から http://forums.asp.net/t/1944241.aspx?Website+publish+failing+due+to+file+path+being+too+long

WebプロジェクトファイルのデフォルトPropertyGroupに次の行を追加します。

<IntermediateOutputPath>..\Temp</IntermediateOutputPath>

上記のパスをC:\ tempまたは......\Tempにすることができます(ドライブのルートにできるだけ近づけるために必要に応じて)。

私の場合、.csprojまたは.vbproj(ウェブサイトプロジェクトファイル)はありませんでしたが、編集しないように警告するwebsite.publishprojファイルがありましたが、とにかくそれを行い、トリックを行いました。

44
Jason Beck

Stelvioのおかげで、 http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2156195-fix-260-character-file-name-length-limitation から、解決策 :

さて、260文字以上のパスでALLOWが動作する回避策を見つけました。

免責事項:このトリックはWindows 8 x64およびVisual Studio 2013でのみ試しました

そのため、mklinkコマンドを使用してフォルダーへのジャンクションを作成しました。

これが元のパスであると想定します:d:\ very\very\long\path\to\solution\folder、d:\ short_path_to_solution_folderとして短いリンクを取得できます。管理者としてDOSシェルからこのコマンドを実行するだけです:mklink/J d :\ short_path_to_solution_folder d:\ very\very\long\path\to\solution\folder

ソースと宛先のパスを必要に応じて変更します

宜しくお願いします!ステルヴィオ

このリンクから: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2156195-fix-260-character-file-name-length-limitation

3
Alexei Bondarev

プロジェクトをルートファイルに近づけると機能します。私に役立つソリューションへのリンクを見つけました。このサイトは、彼のソリューションの背後にある詳細だけでなく、問題の議論でも素晴らしい仕事をしています。

ロングパスの問題に対するHashimi氏のソリューション

編集:

提供されたリンクを要約するには:

MSBuildで使用される公開プロファイルファイルを更新して、Web展開パッケージ(Zipファイル)に公開するときに出力のパスを短縮する置換ルールを含めることができます。

たとえば、Visual Studioで作成された既定のプロファイルを使用して公開すると、Zipファイルで次のパスが取得されます。

archive.xml
Content\C_C\Temp\package\WebApplication1\obj\Release\Package\PackageTmp
Content\C_C\Temp\package\WebApplication1\obj\Release\Package\PackageTmp\bin
Content\C_C\Temp\package\WebApplication1\obj\Release\Package\PackageTmp\bin\WebApplication1.dll
Content\C_C\Temp\package\WebApplication1\obj\Release\Package\PackageTmp\index.html
Content\C_C\Temp\package\WebApplication1\obj\Release\Package\PackageTmp\Web.config
parameters.xml
systemInfo.xml

秘Theは、コンテンツの後に定義されているすべてのパスをより短いパスに置き換えることです。この特定の例では、PackagePath要素のパスを「website」に置き換えます。

発行プロファイルファイル(.pubxml)を編集し、プロジェクト要素が終了する直前に、ファイルの終わり近くに次の行を追加できます。

<PropertyGroup>
  <PackagePath Condition=" '$(PackagePath)'=='' ">website</PackagePath>
  <EnableAddReplaceToUpdatePacakgePath Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='' ">true</EnableAddReplaceToUpdatePacakgePath>
    <PackageDependsOn>
    $(PackageDependsOn);
    AddReplaceRuleForAppPath;
    </PackageDependsOn>
</PropertyGroup>
<Target Name="AddReplaceRuleForAppPath" Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' ">
  <PropertyGroup>
    <_PkgPathFull>$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))</_PkgPathFull>
  </PropertyGroup>

  <!-- escape the text into a regex -->
  <EscapeTextForRegularExpressions Text="$(_PkgPathFull)">
    <Output TaskParameter="Result" PropertyName="_PkgPathRegex" />
  </EscapeTextForRegularExpressions>

  <!-- add the replace rule to update the path -->
  <ItemGroup>
    <MsDeployReplaceRules Include="replaceFullPath">
      <Match>$(_PkgPathRegex)</Match>
      <Replace>$(PackagePath)</Replace>
    </MsDeployReplaceRules>
  </ItemGroup>
</Target>

これで、公開プロファイルのパスは次のようになります。

archive.xml
Content\website
Content\website\bin
Content\website\bin\WebApplication1.dll
Content\website\index.html
Content\website\Web.config
parameters.xml
systemInfo.xml
2
Kram_Koorbse

ジェイソン・ベックの答えは、小さな変化で私に働きかけました。 「IntermediateOutputPathは末尾のスラッシュで終わる必要があります」というエラーを回避するため。パスの末尾に「\」を使用します:..\Temp \

「CONFIG_PUBLISH_FILE.pubxml」は次のようになります(「...」はファイルにある他の設定を省略します):... ... ..\Temp\...

0
mqueirozcorreia

プロジェクトの公開時に、Visual Studioコンパイラはプロジェクトの一部であるファイルのサイズをチェックします。

そこで、ファイル内の長い名前を検索しました。それらのファイルを見つけて名前を変更しました。

完全に機能しましたか

0
Rodrigo Cury