web-dev-qa-db-fra.com

Échec de la publication du site Web en raison d'un chemin de fichier trop long

J'essaie de publier un projet de site Web d'un fournisseur qui a des chemins ridiculement longs vers certains de ses fichiers. Lors de la publication, l'erreur est:

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.

Lorsque je publie, Visual Studio 2012 Update 3 tente d'écrire dans un répertoire temporaire et le préfixe est assez long:

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

Je pensais pouvoir rediriger VS vers un autre répertoire temporaire à c:\tem en suivant ceci SO réponse: chemin temporaire trop long lors de la publication d'un projet de site Web

Je crée mon profil de publication et dès que je l'ouvre, il y a une erreur indiquant que WebPublishMethod n'est pas un élément de PropertyGroup. Quoi qu'il en soit, j'ai mis à jour le fichier pour qu'il ressemble à ceci:

<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>

Lorsque j'essaie de publier, j'obtiens une fenêtre contextuelle modale intitulée "Modification de fichier détectée", avec le message "Le projet YourWebsite a été modifié en dehors de l'environnement", et il me demande si je veux recharger. Dans ma liste d'erreurs, je continue à obtenir l'erreur sur le chemin étant trop long, car il ne tente pas d'utiliser le c:\tem répertoire que j'ai identifié.

J'ai besoin de mettre cette chose sanglante sur un serveur, je suis à la recherche de toute solution qui me permette de publier la chose sanglante. Je ne sais pas grand-chose sur le modèle de projet de site Web, alors faites-moi savoir s'il existe une meilleure façon.

29
Mister Epic

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

Ajoutez la ligne suivante par défaut PropertyGroup du fichier de projet Web.

<IntermediateOutputPath>..\Temp</IntermediateOutputPath>

Vous pouvez probablement faire le chemin ci-dessus C:\temp ou ......\Temp (au besoin pour le rapprocher le plus possible de la racine du lecteur.

Dans mon cas, il n'y avait pas .csproj ou .vbproj (fichier de projet de site Web) mais il y avait un fichier website.publishproj qui vous avertit de ne pas le modifier, mais je l'ai fait quand même, et il a fait l'affaire.

44
Jason Beck

Merci à Stelvio, de http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2156195-fix-260-character-file-name-length-limitation , il y a une solution :

Eh bien, j'ai trouvé une solution de contournement qui autorise le travail avec le chemin d'accès avec plus de 260 caractères.

Avertissement: j'ai essayé cette astuce uniquement sur Windows 8 x64 et Visual Studio 2013

Donc, pour le faire fonctionner, je viens de créer une jonction vers le dossier avec la commande mklink:

Supposons qu'il s'agit du chemin d'origine: d:\very\very\long\path\to\solution\folder, vous pouvez obtenir un lien court en tant que d:\short_path_to_solution_folder juste en parcourant cette commande à partir d'un shell DOS en tant qu'administrateur: mklink/J d :\short_path_to_solution_folder d:\very\very\long\path\to\solution\folder

modifier le chemin de la source et de la destination selon vos besoins

Meilleures salutations! Stelvio

à partir de ce lien: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2156195-fix-260-character-file-name-length-limitation

3
Alexei Bondarev

Tout en rapprochant le projet du fichier racine fonctionne. J'ai trouvé un lien vers une solution qui a fonctionné pour moi. Le site fait également un excellent travail pour discuter de la question ainsi que des détails de sa solution.

Solution de Sayed Hashimi au problème du long chemin

ÉDITER:

Pour résumer le lien fourni:

Vous pouvez mettre à jour votre fichier de profil de publication, qui est utilisé par MSBuild, pour inclure une règle de remplacement qui raccourcira le chemin de votre sortie lors de la publication dans un package de déploiement Web (fichier Zip).

Par exemple, disons que la publication à l'aide du profil par défaut créé par Visual Studio, nous obtenons les chemins suivants dans le fichier 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

L'astuce consiste à remplacer tout le chemin défini après le contenu par un chemin plus court. Dans cet exemple particulier, remplacez le chemin d'accès par "site Web" dans l'élément PackagePath.

On peut modifier le fichier de profil de publication (.pubxml) et ajouter les lignes de suivi vers la fin du fichier, juste avant la fin de l'élément Project.

<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>

Maintenant, les chemins de profil de publication doivent ressembler à ceci:

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

La réponse de Jason Beck a fonctionné pour moi avec un petit changement. Pour éviter l'erreur "IntermediateOutputPath doit se terminer par une barre oblique de fin". utilisez le "\" à la fin du chemin: ..\Temp \

Votre "CONFIG_PUBLISH_FILE.pubxml" devrait ressembler à ceci (le "..." omet toute autre configuration que vous pouvez avoir): ... ... ..\Temp\...

0
mqueirozcorreia

Au moment de la publication du projet, le compilateur Visual Studio vérifie la taille des fichiers qui font partie du projet.

J'ai donc cherché des noms longs dans les fichiers. J'ai trouvé et renommé ces fichiers.

A parfaitement fonctionné

0
Rodrigo Cury