将csproj打包不会包括nuspec中的files元素

4

我正在使用nuget pack myproject.csproj打包一个DLL,但我还想包含一个配置模板。这是相关的nuspec文件:

<?xml version="1.0"?>
<package >
    <metadata>
        <id>$id$</id>
        <version>$version$</version>
        <title>$title$</title>
        <authors>Chris Vann</authors>
        <owners>MyCompany</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>Log4net appenders for targeting MS Azure</description>
        <releaseNotes></releaseNotes>
        <copyright>Copyright 2014</copyright>
        <tags>log4net logging azure</tags>
    </metadata>
    <files>
        <file src="log4net.config" target="."/>
    </files>
</package>

Nuget可以正确导入元数据,但在打包csproj文件时似乎完全忽略了文件元素。是否有此问题的解决方法?
2个回答

4

经过一番NuGet.exe命令行工具的精细调试,我得出了答案:

NuGet.exe使用默认的排除列表从您的软件包中排除某些通常不需要的文件。此列表还包含以点开头的任何文件/文件夹。

将nuspec文件中文件的目标设置为“.”会在使用pack命令打包时将其排除在软件包之外。

解决方案有以下两种: (a)省略目标属性(相当于将目标设置为“”) (b)使用-NoDefaultExcludes选项,例如: pack myproj.csproj -NoDefaultExcludes

这两个解决方案都将得到预期的结果——一个名为log4net.config的文件将被放置在软件包顶部文件夹中,与.nuspec文件和lib文件夹并列。我个人建议您使用选项(a),因为“.”文件夹除了根文件夹没有其他意义。

一个小提示:似乎您需要将log4net.config添加到lib文件夹中,与DLL同级,而不是软件包的根文件夹。


-2

当你使用 nuget pack 命令打包项目文件时,它不会查看 nuspec 文件。这非常基础。如果你想要更多的控制,比如指定文件,你需要使用 nuget pack mypackage.nuspec 命令。

注意:一旦你包含了一个 files 部分,你必须列出所有的文件。


这个问题在于我现在必须管理所有的文件,正如你所说的,还有版本、ID等。这似乎是一个相当大的疏忽。为什么不在默认的项目内容之外,如果有的话,包括文件指令呢? - Chris
5
这不是真的。如果你在一个有nuspec文件的文件夹中运行 nuget pack 命令,它会将csproj作为项目,但仍会读取nuspec文件来获取元数据,你可以在输出中看到这一点。 - Danny Tuppeny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接