2017-08-02 6 views
0

いくつかのファイルをアプリケーションのwwwrootフォルダにコピーするNugetパッケージを作成しようとしていますが、ドキュメンテーションを読んでオンラインで他の質問を見ても動作しないようです。ここまで私がこれまで持っていたことがあります。どのようにあなたはNugetパッケージを持っていますか?DotNetコアプロジェクトにファイルをコピーしますか?

<?xml version="1.0"?> 
<package > 
    <metadata> 
    <id>...</id> 
    <version>...</version> 
    <title>...</title> 
    <authors>...</authors> 
    <requireLicenseAcceptance>...</requireLicenseAcceptance> 
    <description>...</description> 
    <contentFiles> 
     <files include="**/*.*" copyToOutput="true" buildAction="EmbeddedResource" /> 
    </contentFiles> 
    </metadata> 
    <files> 
    <file src="ProjectName\bin\Release\**.dll" target="lib" /> 
    <file src="ProjectName\wwwroot\**.*" target="content\wwwroot" /> 
    <file src="ProjectName\wwwroot\**.*" target="contentFile\any\any\wwwroot" /> 
    </files> 
</package> 

それは予想通りNugetパッケージの内容とコンテンツファイルのフォルダにファイルを置きますが、参照されたときに、プロジェクトにファイルをコピーしていない場合。

答えて

0

したがって、提案されたリンクとインターネットの残りの部分を確認した後、私が思いついた解決策があります。

public static class ApplicationBuilderExtensions 
{ 
    public static IApplicationBuilder UseMyApp(this IApplicationBuilder app) => UseMyApp(app, null); 

    public static IApplicationBuilder UseMyApp(this IApplicationBuilder app, Action<Options> setupOptions) 
    { 
     var options = new Options(); 
     setupOptions?.Invoke(options); 

     app.UseStaticFiles(new StaticFileOptions 
     { 
      RequestPath = $"/{options.RoutePrefix}", 
      FileProvider = new EmbeddedFileProvider(Assembly.Load(new AssemblyName("MyAssembly")), "MyAssembly.EmbeddedResourcesFolder") 
     }); 

     return app; 
    } 

    public class Options 
    { 
     internal Options() { } 

     public string RoutePrefix { get; set; } = "defaultRoutePrefix"; 
    } 
} 

次に、このような方法で静的ファイルを参照できます。

<link rel="stylesheet" href="~/routePrefix/fileName.extension" />

述べたように、それは技術的に私の質問への答えではありませんが、私は何を求めていたことはベストプラクティスではありませんことが明らかである - これはそれを行うためのより良い方法です。

+0

この「ベストプラクティス」がどこから来ているのかわかりません。ディレクトリから静的なファイルを提供することは、埋め込まれたリソースに対する私の意見ではるかに良い解決策になる可能性があります。ファイルの静的ディレクトリを提供することは、多くの方法(nginx、cdn、web.config静的ファイルモジュールなど)で最適化することができ、asp.netパイプラインを打つ必要はありません。モジュラーアプリケーションでは、主な戦略として、静的資産を埋め込みファイルとして提供することを再検討します。 – matt

0

プロジェクトのソースディレクトリにファイルをコピーすることはサポートされておらず、古典的なプロジェクトでは推奨されていません。

ただし、contentFilesセクションは、プロジェクトに論理的にファイルを含めるためのもので、ビルドされた出力に影響を与える可能性があります。 buildAction="Content"は、ファイルをビルドおよびパブリッシュ出力に追加します。これにより、ソースを変更せずにプロジェクトにコンテンツを追加することができます。

+0

私は参照プロジェクトで副作用を望んでいませんが、プロジェクトをパッケージ化する適切な方法は何ですか?それからDLLとJavaScriptとwwwrootフォルダ内にある必要があるCSSが含まれていますか? 私は、リソースを埋め込んだり、必要な場所にコピーしたりするのには解決策を見つけましたが、それほどカスタムはあまり理想的ではありません。 –

+0

なぜ 'wwwroot'に行く必要がありますか? asp.netのコアアプリケーションをホスティングしていてもそのフォルダを持っていたり、静的なファイルをホストするように設定されているという保証はありません。たとえばSwashbuckleはUI関連ファイルを埋め込み、サービスを提供するアプリケーションパイプラインにサービスを設定することができます([source](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore。 SwaggerUI/Application/SwaggerUIBuilderExtensions.cs#L9)) –

関連する問題