【发布时间】:2012-04-04 07:22:57
【问题描述】:
我几乎已经破解了这个 NAnt 的东西,我只能说 Visual Studio 在编译时肯定“隐藏”了很多东西。
我现在通过 NAnt 成功编译了我的 VB.NET 应用程序,但是它没有运行,它出现了错误:
Could not find any resources appropriate for the specified culture or the neutral culture.
Make sure "APP3.Resource.resources" was correctly embedded or linked into assembly "APP3" at compile time, or that all the satellite assemblies required are loadable and fully signed.
当我在 Visual Studio 中编译和运行时,一切正常。
构建文件包含正在编译的所有项目的所有 .resx 文件,在 NAnt 构建过程中我没有收到任何错误。
任何想法将不胜感激:-)
哦,我注意到我的 EXE 小了 6kb,所以显然缺少一些东西,并且 NAnt 进程似乎也没有创建清单文件,或者所有 XML 文件,我认为这是正常的?
<?xml version="1.0"?>
<project name="APP3" default="build" basedir="..\">
<description>APP3 build</description>
<property name="nant.settings.currentframework" value="net-3.5" />
<property name="projectversion" value="3.8.0" />
<property name="project.config" value="debug" />
<target name="init">
<call target="${project.config}" />
</target>
<target name="debug">
<property name="project.config" value="debug" />
<property name="build.debug" value="true" />
<property name="basedir.suffix" value="-debug" />
</target>
<target name="release">
<property name="project.config" value="release" />
<property name="build.debug" value="false" />
<property name="basedir.suffix" value="-release" />
</target>
<target name="clean">
<delete file="${project::get-base-directory()}${project::get-name()}_${projectversion}${basedir.suffix}\APP3_DataClasses.dll" failonerror="false" />
<delete file="${project::get-base-directory()}${project::get-name()}_${projectversion}${basedir.suffix}\classUtilities.dll" failonerror="false" />
<delete file="${project::get-base-directory()}${project::get-name()}_${projectversion}${basedir.suffix}\APP3.exe" failonerror="false" />
</target>
<target name="build-classutilities" depends="init, clean" description="compiles the APP3 utilities class">
<property name="build.dir" value="${project::get-base-directory()}/${project::get-name()}_${projectversion}${basedir.suffix}"/>
<mkdir dir="${build.dir}" />
<vbc target="library" output="${build.dir}/classUtilities.dll" debug="${build.debug}" rootnamespace="classUtilities">
<imports>
<import namespace="Microsoft.VisualBasic" />
<import namespace="System" />
<import namespace="System.Collections" />
<import namespace="System.Collections.Generic" />
<import namespace="System.Data" />
<import namespace="System.Diagnostics" />
<import namespace="System.Linq" />
<import namespace="System.Xml.Linq" />
</imports>
<sources>
<include name="${project::get-base-directory()}/classUtilities/Utilities.vb" />
</sources>
<resources>
<include name="${project::get-base-directory()}/classUtilities/*.resx" />
<include name="${project::get-base-directory()}/classUtilities/My Project/*.resx" />
</resources>
<references>
<include name="System.dll" />
<include name="System.Data.dll" />
<include name="System.Core.dll" />
<include name="System.Xml.dll" />
<include name="System.Xml.Linq.dll" />
</references>
</vbc>
</target>
<target name="build-dataclasses" depends="build-classutilities" description="compiles the APP3 data classes">
<property name="build.dir" value="${project::get-base-directory()}/${project::get-name()}_${projectversion}${basedir.suffix}"/>
<mkdir dir="${build.dir}" />
<vbc target="library" output="${build.dir}/APP3_DataClasses.dll" debug="${build.debug}" rootnamespace="APP3_DataClasses">
<imports>
<import namespace="Microsoft.VisualBasic" />
<import namespace="System" />
<import namespace="System.Collections" />
<import namespace="System.Collections.Generic" />
<import namespace="System.Configuration" />
<import namespace="System.Data" />
<import namespace="System.Diagnostics" />
<import namespace="System.Xml" />
<import namespace="System.Xml.Linq" />
<import namespace="Iesi.Collections" />
</imports>
<sources>
<include name="${project::get-base-directory()}/APP3_DataClasses/**/*.vb" />
</sources>
<resources prefix="APP3_DataClasses">
<include name="${project::get-base-directory()}/APP3_DataClasses/*.resx" />
<include name="${project::get-base-directory()}/APP3_DataClasses/My Project/*.resx" />
<include name="${project::get-base-directory()}/APP3_DataClasses/*.hbm.xml" />
</resources>
<references>
<include name="System.dll" />
<include name="System.Core.dll" />
<include name="System.Xml.dll" />
<include name="System.Xml.Linq.dll" />
<include name="C:\Dev\NHibernate-2.1.2\Required_Bins\Iesi.Collections.dll" />
</references>
</vbc>
</target>
<target name="build" description="compiles the source code" depends="build-dataclasses">
<property name="build.dir" value="${project::get-base-directory()}/${project::get-name()}_${projectversion}${basedir.suffix}"/>
<mkdir dir="${build.dir}" />
<copy file="C:\Dev\NHibernate-2.1.2\Required_Bins\NHibernate.dll" tofile="${build.dir}/NHibernate.dll" />
<copy file="C:\Dev\NHibernate-2.1.2\Required_Bins\Iesi.Collections.dll" tofile="${build.dir}/Iesi.Collections.dll" />
<copy file="C:\Dev\NHibernate-2.1.2\Required_Bins\log4net.dll" tofile="${build.dir}/log4net.dll" />
<copy file="${project::get-base-directory()}/APP3/hibernate.cfg.xml" tofile="${build.dir}/hibernate.cfg.xml" />
<copy file="C:\Dev\LumenWorks.Framework\LumenWorks.Framework.3.8.0\LumenWorks.Framework.IO.dll" tofile="${build.dir}/LumenWorks.Framework.IO.dll" />
<copy file="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11\Microsoft.Office.Interop.Word.dll" tofile="${build.dir}/Microsoft.Office.Interop.Word.dll" />
<copy file="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11\office.dll" tofile="${build.dir}/office.dll" />
<copy file="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11\Microsoft.Vbe.Interop.dll" tofile="${build.dir}/Microsoft.Vbe.Interop.dll" />
<copy file="${project::get-base-directory()}/APP3/app.config" tofile="${build.dir}/APP3.exe.config" />
<copy todir="${build.dir}">
<fileset basedir="C:\Dev\NHibernate-2.1.2\Required_For_LazyLoading\Castle\">
<include name="*.dll" />
</fileset>
</copy>
<vbc target="winexe" output="${build.dir}/APP3.exe" debug="${build.debug}" rootnamespace="APP3">
<imports>
<import namespace="Microsoft.VisualBasic" />
<import namespace="System" />
<import namespace="System.Collections" />
<import namespace="System.Collections.Generic" />
<import namespace="System.Configuration" />
<import namespace="System.Data" />
<import namespace="System.Data.SqlClient" />
<import namespace="System.Diagnostics" />
<import namespace="System.Drawing" />
<import namespace="System.Windows.Forms" />
<import namespace="System.IO" />
<import namespace="System.Xml" />
</imports>
<sources>
<include name="${project::get-base-directory()}/${project::get-name()}/*.vb" />
<include name="${project::get-base-directory()}/${project::get-name()}/classes/*.vb" />
<include name="${project::get-base-directory()}/${project::get-name()}/historical/*.vb" />
<include name="${project::get-base-directory()}/${project::get-name()}/Modules/*.vb" />
<include name="${project::get-base-directory()}/${project::get-name()}/My Project/*.vb" />
</sources>
<resources prefix="APP3" dynamicprefix="true">
<include name="${project::get-base-directory()}/${project::get-name()}/*.resx" />
<include name="${project::get-base-directory()}/${project::get-name()}/My Project/*.resx" />
</resources>
<references>
<include name="Microsoft.VisualBasic.dll" />
<include name="System.dll" />
<include name="System.Data.dll" />
<include name="System.Windows.Forms.dll" />
<include name="System.configuration.dll" />
<include name="System.Drawing.dll" />
<include name="${build.dir}/APP3_DataClasses.dll" />
<include name="${build.dir}/classUtilities.dll" />
<include name="System.Xml.dll" />
<include name="C:\Dev\NHibernate-2.1.2\Required_Bins\Iesi.Collections.dll" />
<include name="C:\Dev\NHibernate-2.1.2\Required_Bins\NHibernate.dll" />
<include name="C:\Dev\NHibernate-2.1.2\Required_Bins\log4net.dll" />
<include name="C:\Dev\LumenWorks.Framework\LumenWorks.Framework.3.8.0\LumenWorks.Framework.IO.dll" />
<include name="C:\Program Files (x86)\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11\Microsoft.Office.Interop.Word.dll" />
</references>
</vbc>
</target>
【问题讨论】:
-
出于好奇和更好的背景:为什么需要使用 NAnt 构建?如今,您可以使用 NAnt 自定义的所有内容都可以使用 MSbuild 进行,除了命令行工具之外,您还可以直接从 VS 执行构建。
-
好问题,老实说,我只需要在我们的新 CI 服务器(Atlassian Bamboo)上编译的东西,我看到 NAnt 和 MSBuild 都可以。如果 MSBuild 在那种情况下更容易工作,CI 服务器没有安装任何类型的 VS,只有 .NET 框架。过去,我们在使用 .NET 2.0 msbuild 时遇到过问题,即没有选择 DLL 的引用路径(它只会选择 1 个),但如果可以克服,那就没问题了。
-
MSBuild 在 3.5 和 4.0 版本中得到了很大改进,4.0 最终与 NAnt 具有同等的功能。它与正常的 .Net Framework 安装一起安装。
-
好的,我唯一担心的是以前很难告诉 msbuild 在构建过程中检查 DLL 的所有路径(3 或 4)。您是否有任何关于如何实现这一点的详细信息,以便 CI 服务器使用不同的构建文件,其中 DLL 与我的开发 PC 位于不同的位置?
-
一般情况下,您应该使用相对路径,并且在所有机器上具有相同的项目布局。但是,使用
HintPath或AssemblySearchPaths,您可以告诉 MSBuild 在哪里搜索引用。您可以在其中包含一个具有默认值的变量,以便它在 VS 中工作,并在 CI 中构建时将其设置为不同的值。更多信息:msdn.microsoft.com/en-us/magazine/dd483291.aspx#id0100048