在 Nuget 中为 PackageReferece 项目打包静态内容
Packing static content in Nuget for PackageReferece projects
我有一个 Class 库 (net47) 项目,我想将我的 dll 和几个静态内容文件(js、css、图像...)打包到一个 nuget 中.我想使用这个 dll 和来自消费者项目的内容。这些项目将是 MVC PackageReference 项目。在这些项目中,本地静态文件位于 wwwroot 文件夹中。
我试过这个:NuGet ContentFiles Demystified 但是我引用了我的 js 和 css 文件(它们没有复制到我的项目内容中)。
在我的 nuspec 中,我尝试了所有构建选项:EmbeddedResource、Content、None 和 Compile,但这些引用总是在编译模式下导入。所以我开始调试的时候出现编译错误
我知道这对于 Package.config 项目是可行的,而且非常简单,但我所有的消费者项目都将是 PackageReference。
这是我的 nuspec
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MyProject</id>
<version>1.0.0</version>
<authors>My</authors>
<owners>My</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>LVP</description>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
<contentFiles>
<files include="any/any/bd.js" buildAction="content" flatten="true" copyToOutput="false"/>
</contentFiles>
</metadata>
<files>
<file src="contentFiles/any/any/bd.js" target="contentFiles/any/any/bd.js" />
</files>
</package>
我用这个 powershell 命令打包我的 nuget:
nuget pack MyProject.nuspec
尽管我也尝试过使用 csproj:
nuget pack MyProject.csproj
我的源文件夹结构是这样的:
C:\...[projectPath]...\contentFiles\any\any\bd.js
安装忽略了我的构建操作。
为什么总是试图编译我的内容文件?有没有更好的方式向消费者项目添加静态内容?
Installation is ignoring my build action. Why is always trying to compile my content files? Is there a better way to add static content to the consumer project?
为了回答您之前的问题 ,我创建了一个示例 nuget 包并将内容文件的构建操作设置为 content
,在安装该 nuget 包之后,构建操作将是设置 content
:
然后我检查了你的.nuspec
文件,发现它应该是正确的。所以这个问题与你的 .nuspec
文件无关。
此外,在上图中,你会注意到内容文件的路径是nuget本地缓存:
C:\Users\<UserName>\.nuget\packages\
NuGet在安装nuget包时会先从本地缓存中提取nuget包,避免下载电脑上已有的包。另一方面,虽然我们在本地更新了nuget包,但nuget会先检测本地缓存,如果在缓存中找到相同的包,nuget会从缓存中安装它,而不是本地提要。
要解决此问题,请尝试在安装更新的 nuget 包之前删除本地缓存中的 nuget 包。 通常,当我们再次打包相同的包时,我们d better change the package version in the
.nuspec` 文件,因此 nuget 本地缓存不会捕获它们。
评论更新:
I've tried increasing the version number and deleting the nuget cache and the problem persists. My build action is always set to "C# Compiler". I just tried changing the name of the js file and the project imports the new name so I do not think it's a cache problem
测试你的 nuget 包后,我找到了你遇到这个问题的原因,我们应该保持 src
和 target
路径在 .nuspec
文件。既然要设置内容文件到wwwroot
文件夹,就应该把文件设置到wwwroot
文件夹,然后打包.nuspec
:
<contentFiles>
<files include="any/any/wwwroot/css/bd.css" buildAction="Content" copyToOutput="false" flatten="true" />
<files include="any/any/wwwroot/js/bd.js" buildAction="Content" copyToOutput="false" flatten="true" />
</contentFiles>
在我的 .nuspec 脚本中(不需要内容节点):
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>BancaDigitalViewProvider</id>
<version>1.0.37</version>
<authors>Ibercaja</authors>
<owners>Ibercaja</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Login View Provider</description>
<copyright>Copyright 2018</copyright>
<tags>Banca Digital View Provider</tags>
<dependencies />
<contentFiles>
<files include="any/any/wwwroot/css/bd.css" buildAction="Content" copyToOutput="false" flatten="true" />
<files include="any/any/wwwroot/js/bd.js" buildAction="Content" copyToOutput="false" flatten="true" />
</contentFiles>
</metadata>
<files>
<file src="contentFiles/any/any/wwwroot/css/bd.css" target="contentFiles/any/any/wwwroot/css/bd.css" />
<file src="contentFiles/any/any/wwwroot/js/bd.js" target="contentFiles/any/any/wwwroot/js/bd.js" />
<file src="bin\debug\BancaDigitalViewProvider.dll" target="lib\net47\BancaDigitalViewProvider.dll" />
</files>
</package>
这是 nuget 包:
https://1drv.ms/u/s!Ai1sp_yvodHfhTk5xutPpaBZLC-A
您可以下载测试
然后安装到ASP.NET核心MVC项目:
希望这会有所帮助。
我有一个 Class 库 (net47) 项目,我想将我的 dll 和几个静态内容文件(js、css、图像...)打包到一个 nuget 中.我想使用这个 dll 和来自消费者项目的内容。这些项目将是 MVC PackageReference 项目。在这些项目中,本地静态文件位于 wwwroot 文件夹中。
我试过这个:NuGet ContentFiles Demystified 但是我引用了我的 js 和 css 文件(它们没有复制到我的项目内容中)。
在我的 nuspec 中,我尝试了所有构建选项:EmbeddedResource、Content、None 和 Compile,但这些引用总是在编译模式下导入。所以我开始调试的时候出现编译错误
我知道这对于 Package.config 项目是可行的,而且非常简单,但我所有的消费者项目都将是 PackageReference。
这是我的 nuspec
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<id>MyProject</id>
<version>1.0.0</version>
<authors>My</authors>
<owners>My</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>LVP</description>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
<contentFiles>
<files include="any/any/bd.js" buildAction="content" flatten="true" copyToOutput="false"/>
</contentFiles>
</metadata>
<files>
<file src="contentFiles/any/any/bd.js" target="contentFiles/any/any/bd.js" />
</files>
</package>
我用这个 powershell 命令打包我的 nuget:
nuget pack MyProject.nuspec
尽管我也尝试过使用 csproj:
nuget pack MyProject.csproj
我的源文件夹结构是这样的:
C:\...[projectPath]...\contentFiles\any\any\bd.js
安装忽略了我的构建操作。 为什么总是试图编译我的内容文件?有没有更好的方式向消费者项目添加静态内容?
Installation is ignoring my build action. Why is always trying to compile my content files? Is there a better way to add static content to the consumer project?
为了回答您之前的问题 content
,在安装该 nuget 包之后,构建操作将是设置 content
:
然后我检查了你的.nuspec
文件,发现它应该是正确的。所以这个问题与你的 .nuspec
文件无关。
此外,在上图中,你会注意到内容文件的路径是nuget本地缓存:
C:\Users\<UserName>\.nuget\packages\
NuGet在安装nuget包时会先从本地缓存中提取nuget包,避免下载电脑上已有的包。另一方面,虽然我们在本地更新了nuget包,但nuget会先检测本地缓存,如果在缓存中找到相同的包,nuget会从缓存中安装它,而不是本地提要。
要解决此问题,请尝试在安装更新的 nuget 包之前删除本地缓存中的 nuget 包。 通常,当我们再次打包相同的包时,我们d better change the package version in the
.nuspec` 文件,因此 nuget 本地缓存不会捕获它们。
评论更新:
I've tried increasing the version number and deleting the nuget cache and the problem persists. My build action is always set to "C# Compiler". I just tried changing the name of the js file and the project imports the new name so I do not think it's a cache problem
测试你的 nuget 包后,我找到了你遇到这个问题的原因,我们应该保持 src
和 target
路径在 .nuspec
文件。既然要设置内容文件到wwwroot
文件夹,就应该把文件设置到wwwroot
文件夹,然后打包.nuspec
:
<contentFiles>
<files include="any/any/wwwroot/css/bd.css" buildAction="Content" copyToOutput="false" flatten="true" />
<files include="any/any/wwwroot/js/bd.js" buildAction="Content" copyToOutput="false" flatten="true" />
</contentFiles>
在我的 .nuspec 脚本中(不需要内容节点):
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>BancaDigitalViewProvider</id>
<version>1.0.37</version>
<authors>Ibercaja</authors>
<owners>Ibercaja</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Login View Provider</description>
<copyright>Copyright 2018</copyright>
<tags>Banca Digital View Provider</tags>
<dependencies />
<contentFiles>
<files include="any/any/wwwroot/css/bd.css" buildAction="Content" copyToOutput="false" flatten="true" />
<files include="any/any/wwwroot/js/bd.js" buildAction="Content" copyToOutput="false" flatten="true" />
</contentFiles>
</metadata>
<files>
<file src="contentFiles/any/any/wwwroot/css/bd.css" target="contentFiles/any/any/wwwroot/css/bd.css" />
<file src="contentFiles/any/any/wwwroot/js/bd.js" target="contentFiles/any/any/wwwroot/js/bd.js" />
<file src="bin\debug\BancaDigitalViewProvider.dll" target="lib\net47\BancaDigitalViewProvider.dll" />
</files>
</package>
这是 nuget 包:
https://1drv.ms/u/s!Ai1sp_yvodHfhTk5xutPpaBZLC-A
您可以下载测试
然后安装到ASP.NET核心MVC项目: