【问题标题】:Nuget package content files not served when deployed部署时不提供 Nuget 包内容文件
【发布时间】:2020-03-22 18:55:44
【问题描述】:

我在 .net core 2.2 上构建了由 Razor 类库 (RCL) 项目组成的 NuGet package。打包后,我看到它包含我配置的静态资产:

当我在目标项目中安装包时,资产引用在项目结构中可见:

但是当我尝试在运行时访问它们时 - 我得到 404: https://localhost:44312/localizer-assets/lib/vue/vue.min.js

我看到这些文件没有“物理地”放置在 wwwroot 文件夹中(它们是 iniside 包文件夹)。

有没有办法提供这些文件?这应该如何配置?

到目前为止,我一直在使用这些方法:

https://www.learnrazorpages.com/advanced/razor-class-library

Can Razor Class Library pack static files (js, css etc) too?

当我直接引用 RCL 项目时它们可以正常工作,但是当与 NuGet 打包并安装时它们就不再工作了。

【问题讨论】:

    标签: asp.net-core nuget visual-studio-2019 razor-class-library


    【解决方案1】:

    当我直接引用 RCL 项目时它们工作正常,但在打包时 使用 NuGet 并已安装不再起作用。

    据我所知,当你使用nuget并选择PackageReference nuget management foramt时,要导入到主项目中的目标文件作为链接引入到你的主项目中(相应的文件不会存在于您的解决方案的物理路径中,但会链接到%userprofile%\.nuget\xxx 中的相应文件地址)。这是PackageReference nuget管理格式的特点。

    解决方案

    为了解决这个问题,我认为您可以在 nuget 项目中添加自定义构建目标(Include MSBuild props and targets in a package)。有了它,您可以将 nuget 包中的文件复制到主项目中。

    1.在\build文件夹中添加一个像.targets或.props这样的目标文件(必须与包id相同)(必须在项目根目录)。所有这些都是基于nuget的打包机制。

    2.将这些代码添加到目标文件中

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <ItemGroup>
            <SourceScriptFiles Include="$(MSBuildThisFileDirectory)..\content\xxxx(relative paths in the current project)" />
        </ItemGroup>
        <Target Name="CopyScriptsToProject" BeforeTargets="Build">
            <Copy SourceFiles="@(SourceScriptFiles)" DestinationFolder="$(ProjectDir)\wwwroot\xxxx\"
            />
        </Target>
    </Project>
    

    使用目标将文件@(SourceScriptFiles) 复制到主项目中。(DestinationFolder 只是目标地址)。

    3.如果你使用 nuspec 文件打包你的包。您还应该在其中的 files 节点下添加这些文件。

    <files>
            <!-- Include everything in \build -->
            <file src="build\**" target="build" />
    
            <!-- Other files -->
            <!-- ... -->
    </files>
    

    另外,这样的操作是预构建事件,当你安装包时,你应该先构建你的项目,然后你会在下面找到该文件目标文件夹。

    另外,这里是a good sample in the github,希望能给出详细的信息和步骤。 希望对你有帮助。

    【讨论】:

    • 非常详细的答案!我将检查此解决方案并提供反馈。我还有两个问题:据我了解,目标项目中已经存在的文件将被覆盖?软件包卸载怎么样 - 据我了解,在安装过程中不会删除复制的文件?
    • 是的。 Copy task 总是会覆盖同一个文件。所以当你想保存旧文件时,请尝试修改目标地址以将文件保存在新文件夹中。并且当您卸载软件包时,它不会卸载复制的文件。因此,您最好将目标地址与项目中现有的文件夹区分开来,或者创建一个不同的文件夹以供以后删除。
    • 感谢您的回答。还有一个问题,有没有什么机制可以在卸载包的时候强制删除文件,如果可以的话可以提示用户是否删除?
    • 据我所知,这是可能的。我知道存在类似 install.ps1 和uninstall.ps1 的东西。在创建 nuget 包时添加这两个脚本,然后 install.ps1 将在有人安装包时执行,而 uninstall.ps1 将在有人卸载该包时执行......所以我认为卸载.ps1 就是你要找的...... .
    • 我现在找不到任何有关这方面的文件,但您可以从onetwo...得到一些帮助...
    猜你喜欢
    • 2015-08-12
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多