Построить через NAnt против Visual Studio - одна DLL отсутствует - PullRequest
2 голосов
/ 07 ноября 2008

Мое решение включает в себя следующие два проекта:

  • MyNamespace.Web.UI
  • MyNamespace.Web.Core

Пользовательский интерфейс ссылается на Core, а Core ссылается на Foobar.dll, который существует нигде, кроме моей библиотеки. При сборке из Visual Studio 2008 Foobar.dll находится в папке Bin проекта пользовательского интерфейса, как и ожидалось. Я удостоверился, что это не было там до сборки.

Но когда я строю из NAnt, его там нет, что приводит к исключению времени выполнения. Вот как выглядит задача NAnt:

<target name="compile" depends="init">
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
       commandline="${solution.file} /m /t:Clean /p:Configuration=${project.config} /v:q" workingdir="." />
    <exec program="${framework::get-framework-directory(framework::get-target-framework())}\msbuild.exe"
       commandline="${solution.file} /m /t:Rebuild /p:Configuration=${project.config} /v:q" workingdir="." />
</target>

В VS я пробовал собирать, перестраивать, перестраивать все в режиме выпуска и в режиме отладки и т. Д. Это всегда одно и то же. Foobar.dll находится в папке Bin. Не так с NAnt. Я также попытался удалить ключ / m из сценария NAnt. Тот же результат.

Есть несколько других dll, на которые ссылаются в Core, а не в UI, и они появляются в Bin, как и ожидалось после сборки NAnt.

Мой обходной путь - ссылаться на Foobar.dll в проекте пользовательского интерфейса, но меня это немного тошнит. Есть идеи, что может вызвать это?

(Между прочим, Foobar.dll на самом деле является NHibernate.ProxyGenerators.CastleDynamicProxy.dll)

Ответы [ 5 ]

2 голосов
/ 12 ноября 2008

Вероятно, у вас есть опция в «Копировать локальное» в VS, которая подразумевает локальное копирование перед сборкой. Вам нужно будет подражать этому в NAnt.

Аналогично тому, почему вы можете просто выполнить «Публикацию» для веб-проекта из Visual Studio, но для командной строки вы должны как создать, так и скопировать вывод в любое место.

1 голос
/ 12 ноября 2008

Раньше я использовал задачу MSBuild в NantContrib, и она, похоже, копировала библиотеки библиотеки в папку bin. Конечно, это не объясняет, почему ваш подход не работает, но я предполагаю, что ваша цель - заставить его строить, а не выяснять, почему он не будет работать

0 голосов
/ 02 декабря 2015

У меня была похожая проблема. Я решил это, явно добавив

Правда

внутри ссылки в файле .csproj, который должен принудительно копировать локальный файл.

<Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\lib\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
  <Private>True</Private>
</Reference>
0 голосов
/ 13 февраля 2009

Я согласен с Кори. Поскольку вы отправляете msbuild, вам необходимо убедиться, что вы скопировали любые сторонние dll (ваши или иные) в вашу папку bin или выходную папку.

Вы можете использовать задачу, чтобы сделать это в Nant, прежде чем запускать задачи. тогда все должно быть хорошо.

Единственный недостаток - вам нужно знать, куда его поместить до запуска задач msbuild, поэтому вам, возможно, придется сначала создать структуру папок и надеяться, что msbuild не уничтожит ее.

Надеюсь, это поможет.

0 голосов
/ 07 ноября 2008

В некоторых вещах, над которыми я работал, я прибегнул к использованию копии задачи NAnt , чтобы скопировать DLL в каталог bin и построить проект. Я не знаю, обязательно ли это лучшая практика, но это работает.

...