如何阻止 NuGet 打包包含不需要的文件
How to stop NuGet packaging from including unwanted files
我正在构建一个 NuGet 包,其文件夹层次结构如下所示:
ProjectDir
Infrastructure
class1.cs
class2.cs
Task
class3.cs
class3.cs
StuffToInclude
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
Project.nuspec
注意 nuspec 文件是使用 "nuget spec" 命令生成的,然后添加以下文件部分:
<files>
<file src="StuffToInclude\**\*.*" target="content" />
</files>
我期望(和想要)的是包中的内容文件夹,如下所示:
content
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
然而,我得到的是一个稍大的内容文件夹,其中包含 "StuffToInclude" 文件夹的第二个副本,如下所示:
content
StuffToInclude
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
请注意,不需要的 StuffToInclude 文件夹中没有 SampleCode 子文件夹——不知何故,nuget 打包程序认为“.pp”文件不应放在内容中,除非明确要求。但是所有这些其他文件(在所有其他文件夹中)都被不必要地复制,并且不希望将它们放在那里 - 因为当包被使用时,该文件夹也会在目标项目中复制。
我认为 nuspec 中的类似内容可能会有所帮助:
<files>
<file src="StuffToInclude\**\*.*" target="content" exclude="StuffToInclude\**\*.*"/>
</files>
但我为 "exclude" 属性尝试的所有变体似乎都没有帮助。
如何排除 "StuffToInclude" 文件不包含在内容文件夹中?
非常感谢。
How to stop NuGet packaging from including unwanted files
我假设您在创建包时使用的命令类似于 nuget pack xx.csproj
。
如果是这样,您在创建 .nuspec 文件后基于项目文件创建包的特殊原因是什么?
根据this document,我们可以根据指定的.nuspec or project file
使用nuget pack
命令。
所以通常情况下,如果我们基于.csproj
创建一个包,则不需要创建.nuspec
文件。另外,如果我们想创建一个基于 .nuspec
的包,我建议使用命令 nuget pack xx.nuspec
而不是 nuget pack xx.csproj
.
问题原因:
我做了一些测试,发现当我们将 Project.nuspec
文件放在项目目录中,并使用像 nuget pack xx.csproj
这样的命令时,nuget.exe 将从 both xx.nuspec and xx.csproj
,这就是为什么你有第二个副本。
1# nuget pack xx.csproj
的结构 if no xx.nuspec
in same directory:
content
StuffToInclude
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
2# nuget pack xx.nuspec
的结构:
content
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
并且当您使用基于项目文件 (.csproj) 的 nuget pack
命令时,其中存在 ProjectName.nuspec,它会从 .csproj 和 .nuspec 中读取数据。所以它会像你得到的那样产生第二个副本。
解决方法:
保留 xx.nuspec 文件并使用类似 nuget pack xx.nuspec
的命令。(建议)
删除 xx.nuspec 文件(或删除 <Files> section
)并使用类似 nuget pack xx.csproj
的命令将那些 xx.cs.pp
文件包含到内容文件夹中, 您可能需要将他们的 build action
设置为 content
.
同时保留 xx.nuspec 文件和 xx.csproj 文件(见下文)以及 xx.nuspec 文件中您想要的所有内容,但要避免不需要的第二个事物的副本,请确保您不想复制两次的每个项目都设置为 None
的 Build Action
。
我正在构建一个 NuGet 包,其文件夹层次结构如下所示:
ProjectDir
Infrastructure
class1.cs
class2.cs
Task
class3.cs
class3.cs
StuffToInclude
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
Project.nuspec
注意 nuspec 文件是使用 "nuget spec" 命令生成的,然后添加以下文件部分:
<files>
<file src="StuffToInclude\**\*.*" target="content" />
</files>
我期望(和想要)的是包中的内容文件夹,如下所示:
content
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
然而,我得到的是一个稍大的内容文件夹,其中包含 "StuffToInclude" 文件夹的第二个副本,如下所示:
content
StuffToInclude
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
请注意,不需要的 StuffToInclude 文件夹中没有 SampleCode 子文件夹——不知何故,nuget 打包程序认为“.pp”文件不应放在内容中,除非明确要求。但是所有这些其他文件(在所有其他文件夹中)都被不必要地复制,并且不希望将它们放在那里 - 因为当包被使用时,该文件夹也会在目标项目中复制。
我认为 nuspec 中的类似内容可能会有所帮助:
<files>
<file src="StuffToInclude\**\*.*" target="content" exclude="StuffToInclude\**\*.*"/>
</files>
但我为 "exclude" 属性尝试的所有变体似乎都没有帮助。
如何排除 "StuffToInclude" 文件不包含在内容文件夹中?
非常感谢。
How to stop NuGet packaging from including unwanted files
我假设您在创建包时使用的命令类似于 nuget pack xx.csproj
。
如果是这样,您在创建 .nuspec 文件后基于项目文件创建包的特殊原因是什么?
根据this document,我们可以根据指定的.nuspec or project file
使用nuget pack
命令。
所以通常情况下,如果我们基于.csproj
创建一个包,则不需要创建.nuspec
文件。另外,如果我们想创建一个基于 .nuspec
的包,我建议使用命令 nuget pack xx.nuspec
而不是 nuget pack xx.csproj
.
问题原因:
我做了一些测试,发现当我们将 Project.nuspec
文件放在项目目录中,并使用像 nuget pack xx.csproj
这样的命令时,nuget.exe 将从 both xx.nuspec and xx.csproj
,这就是为什么你有第二个副本。
1# nuget pack xx.csproj
的结构 if no xx.nuspec
in same directory:
content
StuffToInclude
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
2# nuget pack xx.nuspec
的结构:
content
SampleCode
sampleclass1.cs.pp
sampleclass2.cs.pp
Images
image1.gif
image2.gif
Doc
text1.txt
text2.txt
并且当您使用基于项目文件 (.csproj) 的 nuget pack
命令时,其中存在 ProjectName.nuspec,它会从 .csproj 和 .nuspec 中读取数据。所以它会像你得到的那样产生第二个副本。
解决方法:
保留 xx.nuspec 文件并使用类似
nuget pack xx.nuspec
的命令。(建议)删除 xx.nuspec 文件(或删除
<Files> section
)并使用类似nuget pack xx.csproj
的命令将那些xx.cs.pp
文件包含到内容文件夹中, 您可能需要将他们的build action
设置为content
.同时保留 xx.nuspec 文件和 xx.csproj 文件(见下文)以及 xx.nuspec 文件中您想要的所有内容,但要避免不需要的第二个事物的副本,请确保您不想复制两次的每个项目都设置为
None
的Build Action
。