2010-04-02 5 views
102

Я могу запустить приложение Asp.Net MVC 2 без проблем на моем локальном компьютере. Просто запустите/Отладка.allowDefinition = 'MachineToApplication' ошибка при публикации из VS2010 (но только после предыдущей сборки)

Но если я уже его построил, я не могу его опубликовать! Я должен очистить решение и опубликовать его снова. Я знаю, что это не критическая система, но это очень раздражает. «One Click Опубликовать» не «Чистый раствор, а затем один клик опубликовать»

Точная ошибка выглядит следующим образом:

Ошибка 11 Это ошибка использовать раздел, зарегистрированный в качестве allowDefinition =» MachineToApplication ' за пределами приложения. Эта ошибка может быть вызвана виртуальным каталогом , который не настроен как приложение в IIS.

Я подозреваю, что это как-то связано с Web.Config в папке Views, но тогда почему только после того, как я построил ранее. И просто отметить, приложение работает отлично после опубликования.

+1

Если есть дополнительный web.config в каталоге ребенка, попробуйте удалить его. – user1154664

ответ

73

У меня была такая же проблема с моими приложениями MVC. это было разочарование, потому что я все еще хотел, чтобы мои взгляды должны быть проверены, так что я не хочу, чтобы отключить MvcBuildViews

, к счастью, я наткнулся на post, который дал мне ответ. держать MvcBuildViews, как истинного, то вы можете добавить следующую строку ниже в файле проекта:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath> 

И сделать эту папку не в папке вашего проекта. Работает на меня. Это не идеальное решение, но на данный момент это хорошо. Убедитесь, что вы удалили папку (находящуюся внутри папки obj \ Debug и/или obj \ Release) из папки вашего проекта, иначе вы продолжите получать ошибку.

FWIW, MS know about this error ...

+1

У phil haack есть обновление по этой проблеме, для тех, кто работает с 2010 SP1: http://haacked.com/archive/2011/05/09/compiling-mvc-views-in-a-build-environment. aspx – benpage

+3

nb решение, которое phil на этом блоге НЕ работает для меня. вышеупомянутое решение - мое единственное решение. – benpage

+9

Я думаю, что удаление папки obj является гораздо более простым решением и меньше, чтобы помнить/поддерживать изменения в файле проекта. Похоже, это должен быть главный ответ здесь. (по состоянию на середину 2011 г.) – RyanW

2

У меня тоже была эта проблема, поэтому я создал Событие Pre-Build в свойствах проекта, чтобы очистить выходные каталоги (${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). В другом проекте я также получал эту ошибку, даже при наличии события очистки. На втором проекте я компиляции мнения, как указано в файле проекта:

<MvcBuildViews>true</MvcBuildViews> 

Я изменил истинный ложь, и он больше не жаловался на эту ошибку, но все-таки побежал правильно. Я не буду требовать, чтобы я точно знал, что вызывает вторую ошибку, но по крайней мере мне пришлось двигаться вперед.

+1

Спасибо за это, но я не могу пометить MvcBuildView как False, поскольку он помогает исправлять проблемы до развертывания. – Dann

39

Я удалил все из моей OBJ папки/Debug и исправил эту ошибку. Это позволило мне оставить в опции

<MvcBuildViews>true</MvcBuildViews> 

в моем файле проекта (который поставляется в удобной с шаблоном T4MVC T4).

Редактировать: Этого можно добиться намного проще, просто используя меню «Build» -> «Rebuild Solution» (потому что на самом деле происходит перестройка, это очистить папку obj/Debug, а затем построить решение).

26

Я использую это обходное решение на странице MS Connect для этой ошибки. Он очищает все файлы obj и temp под вашим проектом (все конфигурации) перед запуском AspNetCompiler.

Изменение целевого MvcBuildViews в файл проекта, так что это зависит от целей, которые зачистить упаковки файлов, Visual Studio имеет созданных. Эти цели включены в проекты веб-приложений автоматически.

Все упаковочные файлы будут удалены каждый раз, когда выполняется MvcBuildViews .

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" /> 
</Target> 
+0

Работает для меня.Я также прокомментировал следующую цель работы: kaptan

+0

Обновление - обновление инструментов MVC 3 должно исправить это. http://haacked.com/archive/2011/05/09/compiling-mvc-views-in-a-build-environment.aspx – jrummell

+3

Да ... добавление 'rmdir/S/Q '$ (ProjectDir) \ obj «' к разделу пост-сборки в соответствии с Microsoft Ticket решила проблему! –

3

Что касается решения по jrummell, установка:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

Она работает в VS 2010, но не в VS 2012. В 2012 году вы должны поставить:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Источник:

VS 2010: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web .Publishing.targets

VS 2012: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.targets

+0

Все еще не работает для меня в VS 2012. –

3

Если вы используете веб-публикации , вы можете установить MvcBuildViews=false и PrecompileBeforePublish=true, который прекомпиляции после копирования во временную папку (непосредственно перед публикацией/пакетом).

ПРИМЕЧАНИЕ: PrecompileBeforePublish поддерживается только «новым» стеком трубопроводов веб-публикации (VS2010 SP1 + Azure SDK или VS2012 RTM). Если вы используете VS2010 RTM, вам нужно использовать один из альтернативных методов.

+0

Я не вижу это решение, создавая представления. Я намеренно поставил ошибку в своем представлении и установил PrecompileBeforePublish = True, и это не привело к сбою сборки. (Я использую VS2012) – Hullah

3

Я знаю, что на это был дан ответ, но я просто хотел добавить что-то интересное, что я нашел.

Я установил «MvcBuildViews» в значение false в проекте, удалил все папки bin и obj, и я все еще получал ошибку. Я обнаружил, что есть файл .csproj.user, который по-прежнему имеет значение «MvcBuildViews», равное true.

Я удалил файл «.csproj.user», а затем все это сработало.

Поэтому убедитесь, что вы меняете файл csproj, который вы либо изменяете, либо удаляете файл .csproj.user.

22

Эта проблема возникает, когда в папке obj появляется веб-проект (templated web.config или временные файлы публикации). ASP.Используемый компилятор NET недостаточно умен, чтобы игнорировать файлы в папке obj, поэтому вместо этого он генерирует ошибки.

Еще одно исправление заключается в том, чтобы опубликовать выходные данные прямо перед вызовом <AspNetCompiler>. Откройте .csproj и изменить:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
</Target> 

к этому:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
    <ItemGroup> 
    <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" /> 
    <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" /> 
    </ItemGroup> 
    <Delete Files="@(ExtraWebConfigs)" /> 
    <RemoveDir Directories="@(ExtraPackageTmp)" /> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
</Target> 

Это удалит все web.configs под \ OBJ, а также все папки PackageTmp под \ OBJ.

+0

PLUS ONE все мои возвышения. У меня был некоторый детрит в папке 'obj'. –

+0

Редактор жалуется, что элементы внутри '' являются недопустимыми, но игнорируют это - он работает в любом случае. –

+0

Работал отлично и спасает меня от головной боли при удалении папки obj каждый раз, когда я хочу переключить свою конфигурацию с отладки на выпуск –

0

Проблема связана с промежуточными файлами, но есть еще одно решение, состоящее в очистке этих промежуточных файлов перед созданием представлений.

Это решение было включено в некоторую версию VS, но я могу только сказать, что у меня была проблема в обновлении VOS 2013 г. 5. (Смотрите «Осторожно» ниже, его можно было бы исправить в этой версии, но не работает только в моем конкретном нестандартном случае).

я позаимствовал soltuion из Error: allowDefinition='MachineToApplication' beyond application level on Visual Studio Connect.

Раствор, состоит в том числе и эти строки проекта веб-приложений (.csproj файл), который обрабатывать удаление из offedning промежуточных файлов:

<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level, 
we will need to clean up our temp folder before MVC project starts the pre-compile--> 
<PropertyGroup> 
    <_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews> 
</PropertyGroup> 
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews"> 
    <ItemGroup> 
    <_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" /> 
    </ItemGroup> 
    <!--Force msbuild to expand all the wildcard characters so to get real file paths--> 
    <CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')"> 
    <Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" /> 
    </CreateItem> 
    <Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" /> 
</Target> 

Берегись: по какой-то причине, возможно, потому, что я включил его сам в проект, моя цель сборки для создания представлений была названа "BuildViews", а не "MvcBuildViews", поэтому мне пришлось изменить BeforeTargets соответственно. Я также упростил цель, путем удаления PropertyGroup и упрощения условий, например:

<Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews"> 
    <ItemGroup> 
    <_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" /> 
    </ItemGroup> 
    <!--Force msbuild to expand all the wildcard characters so to get real file paths--> 
    <CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')"> 
    <Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" /> 
    </CreateItem> 
    <Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" /> 
    </Target> 
0

В моем случае я видел, что, когда у меня есть MvcBuildViews и PrecompileDuringPublish, как и верно - было то, что было причиной этой проблемы.

Так что я удалил PrecompileDuringPublish, и это решение сработало для меня, и с тех пор я не сталкивался с этой проблемой.

enter image description here