allowDefinition='MachineToApplication' ошибка при публикации из VS2010 (но только после предыдущей сборки)
Я могу запустить свое приложение Asp.Net MVC 2 без проблем на моем локальном компьютере. Просто запустите / Отладка.
Но если я уже построил это, я не могу опубликовать это! Я должен очистить решение и опубликовать его снова. Я знаю, что это не критично для системы, но это действительно раздражает. "Публикация одним кликом" - это не "Чистое решение, а публикация одним кликом".
Точная ошибка заключается в следующем:
Ошибка 11 Ошибка использования раздела, зарегистрированного как allowDefinition='MachineToApplication' за пределами уровня приложения. Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.
Я подозреваю, что это как-то связано с Web.Config в папке Views, но почему только после того, как я собрал один раз ранее. И просто заметьте, приложение прекрасно работает после публикации.
10 ответов
У меня была такая же проблема с моими приложениями MVC. это было неприятно, потому что я все еще хотел, чтобы мои представления проверялись, поэтому я не хотел отключать MvcBuildViews
К счастью, я наткнулся на пост, который дал мне ответ. оставьте MvcBuildViews как true, тогда вы можете добавить следующую строку внизу в вашем файле проекта:
<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>
И сделайте эту папку не в папке вашего проекта. Работает для меня. Это не идеальное решение, но на данный момент это хорошо. Убедитесь, что вы удалили папку пакета (находится в папке obj\Debug и / или obj\Release) из папки вашего проекта, в противном случае вы продолжите получать сообщение об ошибке.
FWIW, MS знают об этой ошибке...
Я удалил все из моей папки obj/Debug, и это исправило эту ошибку. Это позволило мне уйти в
<MvcBuildViews>true</MvcBuildViews>
вариант в моем файле проекта (который пригодится с шаблоном T4MVC T4).
Редактировать: Этого можно добиться гораздо проще, просто используя меню "Построить" -> "Перестроить решение" (потому что на самом деле перестройка очищает папку obj/Debug, а затем создает решение).
Я использую этот обходной путь на странице 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>
Эта проблема возникает, когда в папке obj есть выходные данные веб-проекта (шаблоны web.config или временные файлы публикации). Используемый компилятор ASP.NET недостаточно умен, чтобы игнорировать вещи в папке obj, поэтому вместо этого он выдает ошибки.
Еще одно исправление - обнулить вывод публикации прямо перед вызовом
<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("$(BaseIntermediateOutputPath)", "PackageTmp", System.IO.SearchOption.AllDirectories))" />
</ItemGroup>
<Delete Files="@(ExtraWebConfigs)" />
<RemoveDir Directories="@(ExtraPackageTmp)" />
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
Это удалит все файлы web.configs в папке \obj, а также все папки PackageTmp в папке \obj.
Если вы используете веб-публикацию, вы можете установить MvcBuildViews=false
а также PrecompileBeforePublish=true
, который прекомпилируется после копирования во временную папку (непосредственно перед публикацией /package).
НОТА: PrecompileBeforePublish
поддерживается только "новым" стеком веб-публикаций (VS2010 SP1 + Azure SDK или VS2012 RTM). Если вы используете VS2010 RTM, вам нужно использовать один из альтернативных методов.
Что касается решения от 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
Я знаю, что на это ответили, но я просто хотел добавить что-то интересное, что нашел.
Я установил "MvcBuildViews" в false в проекте, удалил все папки bin и obj, и все еще получал ошибку. Я обнаружил, что существует файл ".csproj.user", в котором все еще установлено значение "MvcBuildViews".
Я удалил файл ".csproj.user", и тогда все заработало.
Поэтому убедитесь, что если вы меняете свой файл csproj, то вы либо изменили, либо удалили также файл ".csproj.user".
У меня тоже была эта проблема, поэтому я создал Pre-Build Event в свойствах проекта для очистки выходных каталогов (${projectPath}\bin,${projectPath}\obj\${ConfigurationName}
). В другом проекте я также получал эту ошибку, даже с событием очистки на месте. Во втором проекте я компилировал представления, перечисленные в файле проекта:
<MvcBuildViews>true</MvcBuildViews>
Я изменил истину на ложь, и она больше не жаловалась на эту ошибку, но все равно работала правильно. Я не буду утверждать, что точно знаю, что послужило причиной второй ошибки, но, по крайней мере, на какое-то время это заставило меня двигаться вперед.
Проблема связана с промежуточными файлами, но есть и другое решение, заключающееся в очистке этих промежуточных файлов перед построением представлений.
Это решение было включено в некоторые версии VS, но я могу только сказать, что у меня была проблема в VS 2013 Update 5. (См. "Осторожно" ниже, это можно исправить в этой версии, но не работает только в моем конкретном нестандартный случай).
Я позаимствовал решение из Error: allowDefinition='MachineToApplication' за пределами уровня приложения в Visual Studio Connect.
Решение состоит в том, чтобы включить эти строки в проект веб-приложения (.csproj
файл), который обрабатывает удаление промежуточных файлов с исходным кодом:
<!--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>
В моем случае я увидел, что, когда у меня есть MvcBuildViews и PrecompileDuringPublish как оба true - это было причиной этой проблемы.
Поэтому я удалил PrecompileDuringPublish, и это решение сработало для меня, и с тех пор я не сталкивался с этой проблемой.