allowDefinition = 'MachineToApplication' ошибка при публикации из VS2010 (но только после предыдущей сборки) - PullRequest
102 голосов
/ 02 апреля 2010

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

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

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

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

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

Ответы [ 10 ]

76 голосов
/ 19 мая 2010

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

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

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

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

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

40 голосов
/ 22 октября 2010

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

<MvcBuildViews>true</MvcBuildViews>

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

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

26 голосов
/ 07 апреля 2011

Я использую этот обходной путь на странице 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>
24 голосов
/ 09 февраля 2013

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

Еще одно исправление - обнулить вывод публикации прямо перед вызовом . Откройте ваш .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.

4 голосов
/ 22 ноября 2012

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

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

3 голосов
/ 06 февраля 2013

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

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

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

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

3 голосов
/ 12 октября 2012

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

2 голосов
/ 23 апреля 2010

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

<MvcBuildViews>true</MvcBuildViews>

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

0 голосов
/ 30 декабря 2016

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

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

enter image description here

0 голосов
/ 21 октября 2016

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

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

Я позаимствовал решение у Ошибка: 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>
...