Ошибка allowDefinition='MachineToApplication' при публикации из VS2010 (но только после предыдущей сборки)

StackOverflow https://stackoverflow.com/questions/2566215

Вопрос

Я могу запустить свое приложение 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(&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.

Если вы используете веб-публикацию, вы можете установить 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>

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

Поэтому я удалил предварительно скомпилированную публикацию, и это решение сработало для меня, и с тех пор я не сталкивался с этой проблемой.

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top