2010-06-21 2 views
2

Обычно при выполнении скрипта сборки для C# я просто включаю **/*. Cs для каждого проекта/библиотеки dll для сборки. Однако теперь у меня есть ситуация, когда у меня есть некоторые .cs-файлы, которые не являются частью проекта, но живут в этом каталоге (они есть для справочных целей из другой библиотеки). В файле .csproj они не связаны, поэтому VS-сборка работает нормально, но в nant-сборке нет.C# nant build using .csproj files

Кто-нибудь знает, есть ли простой способ вытащить записи .cs из соответствующего файла .csproj и использовать это как список исходных файлов для сборки, а не использовать общий подстановочный знак.

Заранее спасибо.

ответ

4

Любая конкретная причина, по которой вы не хотите использовать msbuild только для бита сборки C#? Это то, что я делаю для своего порта протокольных буферов, и он работает хорошо. Это делает требует nant-contrib, но это не очень сложно.

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

Вы можете посмотреть мой файл сборки портов ProtoBuf here, для вдохновения. Очевидным недостатком является поддержка Mono, но я считаю, что xBuild улучшается ...

+0

Именно так мы это делаем. Вызов MSBuild с помощью задачи 'exec', как предложил Ли, тоже будет работать, но с задачей' msbuild' от nantcotrib это еще более удобно. –

+0

Спасибо, msbuild определенно путь. Мой файл сборки составляет около 1/4 от размера. –

+0

Я попытался построить ваш порт ProtoBuf с помощью xbuild (.sln), строит отлично :) – radical

3

nant имеет support для автоматического построения VS-решений, в том числе csproj файлов, используя задачу <solution>.

последнего поддерживаемого формата решения является VS 2003.

+4

«В настоящее время поддерживаются только решения и проекты Microsoft Visual Studio .NET 2002 и 2003». В наши дни не звучит ужасно полезно. –

2

Вы можете создать проект с использованием MSBuild через Exec задачу вместо того, чтобы вызывать компилятор напрямую, например, msbuild project.csproj.

1

Использование MSBuild - отличная идея. Однако, если есть потерянные файлы (файлы .cs не в .csproj), aspnet_compile.exe иногда терпит неудачу. Чтобы обойти это, я написал следующее, чтобы удалить все * .cs-файлы, которые не включены в .csproj. Пока все хорошо, любые отзывы приветствуются.

<project> 
<foreach item="File" property="csprojFile"> 
<in> 
    <items> 
    <include name="source/**/*.csproj" /> 
    </items> 
</in> 
<do> 
    <property name="currentFolder" value="${directory::get-current-directory()}" /> 
    <property name="csprojParentFolder" value="${directory::get-parent-directory(csprojFile)}" /> 

    <foreach item="File" property="csFile"> 
    <in> 
    <items> 
    <include name="${csprojParentFolder}/**/*.cs"/> 
    </items> 
    </in> 
    <do> 

    <property name="csFileRelativePath" value="${string::replace(csFile, csprojParentFolder + '\', '')}" /> 
    <loadfile property="projFile" file="${csprojFile}" /> 
    <if test="${not string::contains(projFile, csFileRelativePath)}"> 
    <echo message="${csprojFile}: | Missing: ${csFileRelativePath}" /> 
    <!-- <delete file="${csprojParentFolder + '\' + csFileRelativePath}" /> --> 
    </if> 
    </do> 
    </foreach> 

</do> 
</foreach> 
</project>