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

Я могу запустить приложение Asp.Net MVC 2 без проблем на моем локальном компьютере. Просто запустите/Отладка.

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

Точная ошибка следующая:

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

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

Ответ 1

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

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

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

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

FWIW, MS знает об этой ошибке...

Ответ 2

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

<MvcBuildViews>true</MvcBuildViews>

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Другое исправление заключается в том, чтобы nuke вывести публикацию прямо перед вызовом <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.

Ответ 5

Что касается решения 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

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

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

<MvcBuildViews>true</MvcBuildViews>

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

Ответ 9

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

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

Я заимствовал soltuion из Ошибка: allowDefinition = 'MachineToApplication' за пределами уровня приложения в Visual Studio Connect.

Решение состоит в включении этих строк в проект веб-приложения (.csproj file), который обрабатывает удаление промежуточных файлов 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>

Ответ 10

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

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

введите описание изображения здесь