Ошибка allowDefinition='MachineToApplication' при публикации из VS2010 (но только после предыдущей сборки)
-
23-09-2019 - |
Вопрос
Я могу запустить свое приложение Asp.Net MVC 2 без проблем на моем локальном компьютере.Просто запустите / Отладьте.
Но если я уже создал его, я не могу его опубликовать!Я должен очистить решение и опубликовать его снова.Я знаю, что это не критично для системы, но это действительно раздражает."Публикация в один клик" - это не "Чистое решение, а затем публикация в один клик".
Точная ошибка заключается в следующем:
Ошибка 11 Использование раздела, зарегистрированного как allowDefinition='MachineToApplication' за пределами уровня приложения, является ошибкой.Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.
Я подозреваю, что это как-то связано с Web.Config в папке Views, но тогда почему только после того, как я собрал один раз ранее.И просто хочу отметить, что после публикации приложение работает нормально.
Решение
у меня была такая же проблема с моими приложениями MVC.это было неприятно, потому что я все еще хотел, чтобы мои просмотры проверялись, поэтому я не хотел отключаться Просмотры MvcBuildViews
к счастью, я наткнулся на Публикация что дало мне ответ.сохраните MvcBuildViews как верно, затем вы можете добавить следующую строку внизу в свой файл проекта:
<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>
И сделайте так, чтобы этой папки не было в папке вашего проекта.У меня это работает.Это не идеальное решение, но на данный момент оно хорошее.Убедитесь, что вы удалили упаковка папка (расположена внутри obj\Отладка и/или obj\Релиз папка) из папки вашего проекта, в противном случае вы будете продолжать получать сообщение об ошибке.
FWIW, MS знает об этой ошибке...
Другие советы
Я удалил все из своей папки obj / Debug, и это исправило эту ошибку.Это позволило мне уйти в
<MvcBuildViews>true</MvcBuildViews>
опция в моем файле проекта (которая пригодится вместе с шаблоном T4MVC T4).
Редактировать:Этого можно достичь намного проще, просто используя меню "Сборка" -> "Перестроить решение" (потому что на самом деле rebuild очищает папку obj / Debug, а затем создает решение).
Я использую это обходное решение для MS Connect (MS Connect) страница для устранения этой ошибки.Он очищает все obj и временные файлы в вашем проекте (все конфигурации) перед запуском 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, поэтому вместо этого он выдает ошибки.
Другое исправление заключается в уничтожении выходных данных публикации непосредственно перед вызовом <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("$(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
, который предварительно компилируется после копирования во временную папку (непосредственно перед публикацией / упаковкой).
ПРИМЕЧАНИЕ: PrecompileBeforePublish
поддерживается только "новым" стеком конвейера веб-публикации (VS2010 SP1 + Azure SDK или VS2012 RTM).Если вы используете VS2010 RTM, вам нужно будет использовать один из альтернативных методов.
Что касается решения jrummell, то настройка:
DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"
IT работает в VS 2010, но не в VS 2012.В 2012 году вы должны поставить:
DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"
Источник:
ПО СРАВНЕНИЮ С 2010 годом:C:\Program Файлы (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets
ПО СРАВНЕНИЮ С 2012 годом:C:\Program Файлы (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets
Я знаю, что на этот вопрос уже был дан ответ, но я просто хотел добавить кое-что интересное, что я нашел.
Я установил для "MvcBuildViews" значение false в проекте, удалил все папки bin и obj, и я все еще получал сообщение об ошибке.Я обнаружил, что существует файл ".csproj.user", для которого "MvcBuildViews" все еще установлено значение true.
Я удалил файл ".csproj.user", и тогда все заработало.
Поэтому убедитесь, что при изменении вашего файла csproj вы также изменили или удалили файл ".csproj.user".
У меня тоже была эта проблема, поэтому я создал событие предварительной сборки в свойствах проекта, чтобы очистить выходные каталоги (${projectPath}\bin,${projectPath}\obj\${ConfigurationName}
).В другом проекте я также получал эту ошибку, даже при наличии события очистки.Во втором проекте я компилировал представления, перечисленные в файле проекта:
<MvcBuildViews>true</MvcBuildViews>
Я изменил значение true на false, и он больше не жаловался на эту ошибку, но по-прежнему работал корректно.Я не буду утверждать, что точно знаю, что стало причиной второй ошибки, но, по крайней мере, на данный момент это помогло мне продвинуться вперед.
Проблема связана с промежуточными файлами, но есть другое решение, которое заключается в очистке этих промежуточных файлов перед сборкой представлений.
Это решение было включено в какую-то версию VS, но я могу только сказать, что у меня возникла проблема в обновлении 5 VS 2013.(Смотрите "Берегись" ниже это может быть исправлено в этой версии, но не работает только в моем конкретном нестандартном случае).
Я позаимствовал это решение у Ошибка:allowDefinition='MachineToApplication' за пределами уровня приложения в Visual Studio Connect.
Решение состоит в том, чтобы включить эти строки в проект веб-приложения (.csproj
file), которые обрабатывают удаление удаляемых промежуточных файлов:
<!--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>