如何在NuGet软件包中包含JS文件

时间:2019-11-18 18:15:02

标签: visual-studio nuget nuget-package target .net-standard

我需要创建一个.NET Standard 2.1 NuGet程序包,其中包含一个JavaScript文件,该文件将通过以下路径添加到我使用的应用程序中:

  

/wwwroot/js/myFileFromNugetPackage.js

(正在使用的应用程序恰好是Blazor Server应用程序)

我跟踪了一个{* 3}},该文件使用了* .targets文件,但对我来说不起作用。

我最近得到的是按照以下步骤设置我的NuGet项目:

  1. 创建一个名为“ wwwroot”的顶级文件夹
  2. 添加文件“ wwwroot / js / myFileFromNugetPackage.js”
  3. 在该JS文件的属性中,设置“构建操作=内容”和“复制到输出目录” =“始终复制”

我将其发布到我的私有NuGet库中。

然后我将该程序包添加到我的Blazor(.Net Core 3.1)应用程序中。

当我在Visual Studio的解决方案资源管理器中查看时,我看到的看起来很有希望:

  

/wwwroot/js/myFileFromNugetPackage.js

但是...

如果我在同一目录中手动创建一个新文件,那么我现在拥有:

  

/wwwroot/js/manuallyAddedFile.js   /wwwroot/js/myFileFromNugetPackage.js

当我进入两个文件的属性时,会看到不同的路径:

  

C:{some path} \ MyApplication \ wwwroot \ js \ manuallyAddedFile.js

  

C:\ Users \ {me} \。nuget \ packages \ {myNuGetPackage} \ {version} \ contentFiles \ any \ netstandard2.1 \ wwwroot \ js \ myFileFromNugetPackage.js

毫不奇怪,当我尝试使用Blazor的JS Interop使用这些JS文件中的任何一个时,我都可以使用手动输入的文件,但找不到从我的NuGet包中找到的文件。 F12开发人员工具仅显示客户端上手动创建的一个。

所以,我的问题是:如何设置我的NuGet项目以编写JS文件,使其最终位于正确的目录中?

1 个答案:

答案 0 :(得分:0)

  

毫不奇怪,当我尝试使用其中任何一个JS文件时   使用Blazor的JS Interop,我可以使用手动输入的JS   无法从我的NuGet包中找到一个。

因为您只能使用packagesreference nuget management format在Blazor应用程序(新的SDK格式)中,所以您导入的包只能通过引用链接将文件的形式导入到项目中一个包,所以是myFileFromNugetPackage。显示在路径../. Nuget/packages中的Js属性。

这也是pacakgesreference nuget管理格式的功能。顺便说一下,packagesconfig nuget management format并非如此。

添加新项目时,这意味着您已经在当前解决方案下创建了一个文件,因此您可以在解决方案下找到新文件。

  

我遵循了一个使用* .targets文件的示例,但是没有用   为了我。所以,我的问题是:如何设置我的NuGet项目以编写   一个JS文件,以便将其保存在正确的目录中?

解决方案

要解决您的问题,您可以将目标文件添加到nuget程序包中,该程序包会将实际文件复制到项目中,以便在主项目中引用该文件,而在链接中不引用该文件。

我尝试了您的链接演示,它可以成功实现您的目标。 核心是本段

 <ItemGroup>
        <SourceScriptFiles Include="$(MSBuildThisFileDirectory)..\content\scriptsToGenerate\*.js" />
    </ItemGroup>
    <Target Name="CopyScriptsToProject" BeforeTargets="Build">
        <Copy SourceFiles="@(SourceScriptFiles)" DestinationFolder="$(ProjectDir)\wwwroot\js\scriptsToGenerate\"
        />
    </Target>

注意:

在某些情况下,您可能希望在使用软件包的项目中添加自定义构建目标或属性,例如在构建过程中运行自定义工具或过程。为此,您可以将文件以<package_id>.targets<package_id>.props的形式(例如Contoso.Utility.UsefulStuff.targets)放置在项目的\ build文件夹中。

此预处理目标只能在构建时执行,  因此,我怀疑您在没有构建项目的情况下就无法在主项目中找到JS文件。希望它能为您提供帮助。