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