Есть ли способ изменить .net mvc bin dir location?
У меня есть довольно стандартный и простой веб-сайт MVC4.
В корневом каталоге мы имеем: bin, content, scripts, views. Используя настройки по умолчанию, DLL проекта, позвольте называть его "web.dll", и все необходимые дополнения переходят в каталог bin.
Как-то, сервер ASP.NET dev и IIS7.5 оба знают, что искать "web.dll" в папке bin при размещении сайта, а если нет, то они выдают ошибку: "Невозможно загрузить тип CVD. Web.MvcApplication". Стандартное решение этой ошибки состоит в том, чтобы напрямую вставить в папку bin, которая не работает для меня, потому что...
В целях отладки, я хотел бы иметь возможность строить конфигурации Debug и Release в bin/Debug и bin/Release соответственно, а затем развертывать оба каталога, а затем изменять настройки в IIS, web.config, global. asax или где-либо еще, чтобы выбрать, следует ли загружать и выполнять сборку Debug или Release на сервере.
Я не смог найти, если это возможно, или если .net webapps имеет глупые жестко закодированные правила, говорящие, что весь код должен находиться в каталоге bin.
Ответы
Ответ 1
ОК, поэтому с помощью нескольких ссылок, предоставленных Сен Якобом и еще нескольких исследований, я выяснил, что это можно сделать только с помощью web.config.
Прежде всего, нам нужно предоставить новый путь и указать имя сборки, так как мы удаляем настройки по умолчанию:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="Something.Web" />
</assemblies>
</compilation>
</system.web>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin\debug" />
</assemblyBinding>
</runtime>
</configuration>
Теперь, по какой-то причине, везде люди предлагают указать privatePath
относительно bin dir (т.е. privatePath="debug"
), однако в моем случае это должно быть относительно корня приложения (т.е. как указано выше). Возможно, это изменение в .net4 или какой-либо другой настройке конфигурации, которую я пропускаю, не уверен; если у кого-то есть лучшая идея, не стесняйтесь редактировать/комментировать.
На этом этапе, если сервер найдет файл и успешно загрузит сборку и класс, он начнет жаловаться на все отсутствующие ссылки на файлы, которые мне пришлось добавить рядом с <add assembly="Something.Web" />
:
<assemblies>
<add assembly="Something.Web" />
<add assembly="System.Web.Mvc" />
<add assembly="System.Web.Optimization" />
<add assembly="System.Web.Helpers" />
<add assembly="System.Web.WebPages" />
</assemblies>
Из того, что я собрал, он повторно компилирует сборки при запуске сайта (не уверен).
Источники:
1
2
3
Ответ 2
У меня была такая же проблема. Чтобы решить эту проблему, я создал соединение каталога, называемое "bin", в целевой каталог в событии Post-Build:
if exist "$(ProjectDir)bin" rmdir "$(ProjectDir)bin"
mklink /J "$(ProjectDir)bin" "$(TargetDir)"
Таким образом вы можете установить выходной путь в другое место, даже полностью вне исходного дерева.
IISExpress по-прежнему будет запускаться из вашей папки проекта в исходном дереве, но после соединения с бингом, чтобы найти встроенные библиотеки DLL. Обратите внимание, что другие файлы будут использоваться из местоположения исходного дерева.
Соединение удаляется и воссоздается каждый раз, если вы переключаете конфигурации сборки.
Убедитесь, что каталог bin еще не существует из старой настройки сборки, rmdir не будет работать, если в каталоге (real) bin есть файлы.
Ответ 3
Поскольку probing privatePath
очень ограничен (он может указывать только на подкаталог), я думаю, что mikek - лучший ответ. Но есть еще одна альтернатива: вручную отредактируйте файл applicationhost.config
и измените путь.
Внутри файла applicationhost.config
(который должен находиться внутри директории .vs\config\
, которую Visual Studio создает внутри директории вашего решения) найдите свой сайт и измените physicalPath
на любое место, которое вам нужно.
Просто помните, что вам придется установить путь на один каталог выше самого каталога bin. И это становится немного хуже: вам также нужно помнить, чтобы скопировать Global.asax
и web.config
в этот каталог. В конце концов у вас будет
phsicalPath="Z:\myRamDisk\MySite"
Z:\myRamDisk\MySite
bin\
Global.asax
Web.config
Вы можете использовать сборку даже для копирования необходимых файлов.
Это отстой, но по крайней мере это работает. Это либо предложение, либо предложение mklink
Майка.
Ответ 4
В проводнике решений щелкните правой кнопкой мыши по вашему проекту > свойства
Возьмите вкладку сборки и измените путь вывода из /bin туда, где вы хотите.
![enter image description here]()
Вы можете изменить конфигурацию из верхнего комбинированного поля в Debug/Release и установить каждый наш путь по отдельности.