2013-10-15 19 views
5

Sto lavorando a un progetto con alcuni file profondamente annidati (lungo namespace). Il progetto non verrà compilato perché il nome file della maggior parte dei file di risorse è troppo lungo. Per es.Nome file risorsa troppo lungo

Resource file 
"obj\Debug\xxxx.xxxxxxxxxxxxx.xxxx.Services.DeliveryChannels.Web.Common.Resources.xxxxxxxxxxxxxxxxxxx.resources" has an invalid name. The item metadata "%(FullPath)" cannot be applied to the path 
"obj\Debug\xxxx.xxxxxxxxxxxxx.xxxx.Services.DeliveryChannels.Web.Common.Resources.xxxxxxxxxxxxxxxxxxx.resources". 
D:\Projects\XXXXX\TFS\xxxxx.xxxxx\src\xxxxx.xxxxxxxx.xxxxx\svcs\channels\web\src\xxxxxxx.Web.Common\obj\Debug\xxxx.xxxxxxxxxxxx.xxxxxx.Services.xxxxxxxxxx.Web.Common.Resources.xxxxxxxxxxxxxxxxxx.resources 

Un altro errore:

File name 
'..\..\..\..\..\obj\Debug\xxxx.xxxxxxxxxxxxx.xxxx.Services.DeliveryChannels.Web.Common.Resources.xxxxxxxxxxxxxxxxxxx.resources' is too long or invalid 

Come faccio a impedire al compilatore di rinominare il file .resource allo spazio dei nomi? Vorrei che il nome del file delle risorse fosse lo stesso dopo la compilazione.

+2

Odio chiedere l'ovvio, ma c'è qualche possibilità che si può spostare il progetto in una directory che sia un nome più breve o è più vicina alla unità principale? –

risposta

9

Modificare la linea 2291 su C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.Common.Targets

<GenerateResource 
    Sources="@(EmbeddedResource)" 
    UseSourcePath="$(UseSourcePath)" 
    References="@(ReferencePath)" 
    AdditionalInputs="$(MSBuildAllProjects)" 
    NeverLockTypeAssemblies="$(GenerateResourceNeverLockTypeAssemblies)" 
    StateFile="$(IntermediateOutputPath)$(MSBuildProjectFile).GenerateResource.Cache" 
    StronglyTypedClassName="%(EmbeddedResource.StronglyTypedClassName)" 
    StronglyTypedFileName="%(EmbeddedResource.StronglyTypedFileName)" 
    StronglyTypedLanguage="%(EmbeddedResource.StronglyTypedLanguage)" 
    StronglyTypedNamespace="%(EmbeddedResource.StronglyTypedNamespace)" 
    StronglyTypedManifestPrefix="%(EmbeddedResource.StronglyTypedManifestPrefix)" 
    PublicClass="%(EmbeddedResource.PublicClass)" 
    OutputResources="@(EmbeddedResource->'$(IntermediateOutputPath)%(ManifestResourceName).resources')" 
    Condition="'%(EmbeddedResource.Type)' == 'Resx' and '%(EmbeddedResource.GenerateResource)' != 'false' and '$(GenerateResourceMSBuildRuntime)' != 'CLR2'" 
    SdkToolsPath="$(ResgenToolPath)" 
    ExecuteAsTool="$(ResGenExecuteAsTool)" 
    EnvironmentVariables="$(ResGenEnvironment)" 
    MSBuildRuntime="$(GenerateResourceMSBuildRuntime)" 
    MSBuildArchitecture="$(GenerateResourceMSBuildArchitecture)"> 

Cambiare il nome del file di output a qualcosa di breve come il nome del file sorgente e sperare in assenza di collisioni.

OutputResources="@(EmbeddedResource->'$(IntermediateOutputPath)%(Filename).resources')" 

Questo è un trucco per un file system dotnet, ci deve essere un altro modo per ignorare questo, ho bisogno di controllare la documentazione MSBuild.

Modifica

I found a solution without needing to mess with system files. 

Vedi qui MSDN http://blogs.msdn.com/b/visualstudio/archive/2010/02/15/if-your-build-fails-with-msb6002-the-command-line-for-the-resgen-task-is-too-long.aspx.

È possibile incollare l'intero Target all'interno del progetto, in questo modo non è necessario modificare un file di sistema. Basta incollarlo prima del tag </Project>.

<Target 
    Name="CoreResGen" 
    DependsOnTargets="$(CoreResGenDependsOn)"> 

    <ItemGroup> 
     <_Temporary Remove="@(_Temporary)" /> 
    </ItemGroup> 

    <PropertyGroup> 
     <GenerateResourceMSBuildArchitecture Condition="'$(GenerateResourceMSBuildArchitecture)' == ''">$(PlatformTargetAsMSBuildArchitecture)</GenerateResourceMSBuildArchitecture> 

     <ResgenToolPath Condition="'$(ResgenToolPath)' == ''">$(TargetFrameworkSDKToolsDirectory)</ResgenToolPath> 
    </PropertyGroup> 

    <PropertyGroup Condition="'$(TargetFrameworkAsMSBuildRuntime)' != '' and '$(GenerateResourceMSBuildArchitecture)' != ''"> 
     <!-- In the general case, we want to fail to run the task if the task host it's requesting doesn't exist, because we'd rather let the 
     user know there's something wrong than just silently generate something that's probably not quite right. However, in a few 
     circumstances, there are tasks that are already aware of runtime/bitness concerns, in which case even if we go ahead and run 
     the more recent version of the task, it should be able to generate something correct. GenerateResource is one such task, so 
     we check for the existence of the targeted task host so that we can use it preferentially, but if it can't be found, we'll fall 
     back to the current task since it's still mostly correct. 

     In particular, we need to do this because otherwise people with Dev10 on a machine that they upgrade to Win8 will be broken: 
     they'll have ResGen from the 7.0A SDK installed, so launching ResGen will still work, but the CLR2 task host is only installed by 
     the 8.0A SDK, which they won't have installed, and thus without this fallback mechanism, their projects targeting v3.5 will 
     suddenly start failing to build.--> 
     <GenerateResourceMSBuildRuntime 
      Condition="'$(GenerateResourceMSBuildRuntime)' == '' and 
       $([MSBuild]::DoesTaskHostExist(`$(TargetFrameworkAsMSBuildRuntime)`, `$(GenerateResourceMSBuildArchitecture)`))">$(TargetFrameworkAsMSBuildRuntime)</GenerateResourceMSBuildRuntime> 

     <!-- If the targeted runtime doesn't exist, fall back to current --> 
     <GenerateResourceMSBuildRuntime Condition="'$(GenerateResourceMSBuildRuntime)' == ''">CurrentRuntime</GenerateResourceMSBuildRuntime> 
    </PropertyGroup> 

    <!-- 4.0 task has some new parameters that we want to make use of if we're targeting 4.0 --> 
    <GenerateResource 
     Sources="@(EmbeddedResource)" 
     UseSourcePath="$(UseSourcePath)" 
     References="@(ReferencePath)" 
     AdditionalInputs="$(MSBuildAllProjects)" 
     NeverLockTypeAssemblies="$(GenerateResourceNeverLockTypeAssemblies)" 
     StateFile="$(IntermediateOutputPath)$(MSBuildProjectFile).GenerateResource.Cache" 
     StronglyTypedClassName="%(EmbeddedResource.StronglyTypedClassName)" 
     StronglyTypedFileName="%(EmbeddedResource.StronglyTypedFileName)" 
     StronglyTypedLanguage="%(EmbeddedResource.StronglyTypedLanguage)" 
     StronglyTypedNamespace="%(EmbeddedResource.StronglyTypedNamespace)" 
     StronglyTypedManifestPrefix="%(EmbeddedResource.StronglyTypedManifestPrefix)" 
     PublicClass="%(EmbeddedResource.PublicClass)" 
     OutputResources="@(EmbeddedResource->'$(IntermediateOutputPath)%(Filename).resources')" 
     Condition="'%(EmbeddedResource.Type)' == 'Resx' and '%(EmbeddedResource.GenerateResource)' != 'false' and '$(GenerateResourceMSBuildRuntime)' != 'CLR2'" 
     SdkToolsPath="$(ResgenToolPath)" 
     ExecuteAsTool="$(ResGenExecuteAsTool)" 
     EnvironmentVariables="$(ResGenEnvironment)" 
     MSBuildRuntime="$(GenerateResourceMSBuildRuntime)" 
     MSBuildArchitecture="$(GenerateResourceMSBuildArchitecture)"> 

     <Output TaskParameter="FilesWritten" 
       ItemName="FileWrites"/> 
     <Output TaskParameter="StronglyTypedFileName" 
       ItemName="Compile"/> 

     <!-- Gather Sources as an output since it will contain OutputResource metadata indicating the final output resource that it was compiled into --> 
     <Output TaskParameter="Sources" 
       ItemName="_Temporary" /> 

    </GenerateResource> 

    <!-- But we can't use those parameters if we're targeting 3.5, since we're using the 3.5 task --> 
    <GenerateResource 
     Sources="@(EmbeddedResource)" 
     UseSourcePath="$(UseSourcePath)" 
     References="@(ReferencePath)" 
     AdditionalInputs="$(MSBuildAllProjects)" 
     NeverLockTypeAssemblies="$(GenerateResourceNeverLockTypeAssemblies)" 
     StateFile="$(IntermediateOutputPath)$(MSBuildProjectFile).GenerateResource.Cache" 
     StronglyTypedClassName="%(EmbeddedResource.StronglyTypedClassName)" 
     StronglyTypedFileName="%(EmbeddedResource.StronglyTypedFileName)" 
     StronglyTypedLanguage="%(EmbeddedResource.StronglyTypedLanguage)" 
     StronglyTypedNamespace="%(EmbeddedResource.StronglyTypedNamespace)" 
     StronglyTypedManifestPrefix="%(EmbeddedResource.StronglyTypedManifestPrefix)" 
     PublicClass="%(EmbeddedResource.PublicClass)" 
     OutputResources="@(EmbeddedResource->'$(IntermediateOutputPath)%(ManifestResourceName).resources')" 
     MSBuildRuntime="$(GenerateResourceMSBuildRuntime)" 
     MSBuildArchitecture="$(GenerateResourceMSBuildArchitecture)" 
     Condition="'%(EmbeddedResource.Type)' == 'Resx' and '%(EmbeddedResource.GenerateResource)' != 'false' and '$(GenerateResourceMSBuildRuntime)' == 'CLR2'"> 

     <Output TaskParameter="FilesWritten" 
       ItemName="FileWrites"/> 
     <Output TaskParameter="StronglyTypedFileName" 
       ItemName="Compile"/> 

     <!-- Gather Sources as an output since it will contain OutputResource metadata indicating the final output resource that it was compiled into --> 
     <Output TaskParameter="Sources" 
       ItemName="_Temporary" /> 

    </GenerateResource> 

    <ItemGroup> 
     <EmbeddedResource Remove="@(_Temporary)" /> 

     <!-- Add back the Sources list (with OutputResource metadata) that we output from GenerateResource into EmbeddedResource --> 
     <EmbeddedResource Include="@(_Temporary)" /> 
     <_Temporary Remove="@(_Temporary)" /> 

     <!-- EMITTED FOR COMPATIBILITY REASONS ONLY. CONSUME EMBEDDEDRESOURCE INSTEAD --> 
     <ManifestResourceWithNoCulture Include="@(EmbeddedResource->'%(OutputResource)')" 
             Condition="'%(EmbeddedResource.WithCulture)'=='false' and '%(EmbeddedResource.Type)' == 'Resx'"> 
      <EmittedForCompatibilityOnly>true</EmittedForCompatibilityOnly> 
     </ManifestResourceWithNoCulture> 
     <ManifestNonResxWithNoCultureOnDisk Include="@(EmbeddedResource)" 
              Condition="'%(EmbeddedResource.WithCulture)'=='false' and '%(EmbeddedResource.Type)' == 'Non-Resx'"> 
      <EmittedForCompatibilityOnly>true</EmittedForCompatibilityOnly> 
     </ManifestNonResxWithNoCultureOnDisk> 

     <!-- EMITTED FOR COMPATIBILITY REASONS ONLY. CONSUME EMBEDDEDRESOURCE INSTEAD --> 
     <ManifestResourceWithCulture Include="@(EmbeddedResource->'%(OutputResource)')" 
            Condition="'%(EmbeddedResource.WithCulture)'=='true' and '%(EmbeddedResource.Type)' == 'Resx'"> 
      <EmittedForCompatibilityOnly>true</EmittedForCompatibilityOnly> 
     </ManifestResourceWithCulture> 
     <ManifestNonResxWithCultureOnDisk Include="@(EmbeddedResource)" 
              Condition="'%(EmbeddedResource.WithCulture)'=='true' and '%(EmbeddedResource.Type)' == 'Non-Resx'"> 
      <EmittedForCompatibilityOnly>true</EmittedForCompatibilityOnly> 
     </ManifestNonResxWithCultureOnDisk> 

    </ItemGroup> 

</Target> 
+0

Ho applicato la correzione sopra, e sembra funzionare, ma ho anche avuto bisogno di modificare il file "Resources.Designer.cs", poiché la correzione sembra cambiare il nome del file di risorse. La riga modificata è: global :: System.Resources.ResourceManager temp = new global :: System.Resources.ResourceManager ("Resources", typeof (Resources) .Assembly); – Cathartis

+0

Per me, lo spostamento del progetto nella cartella principale della cartella ha risolto il problema. Questo a causa della limitazione dei caratteri di percorso con Windows – Thaadikkaaran

Problemi correlati