JavaScriptに完全に依存するいくつかのWebアプリの作業を開始しています(以前のアプリはASP.NET MVCであり、JavaScriptの「良さ」が上に散らばっています)。
全面的に共有されるファイルがいくつかあります。これらのファイルを共通プロジェクトに保存し、(コンパイルされたコードで可能なように)個々のプロジェクトに「リンクとして追加」すると便利です。
明らかに、ファイルが実際には正しい場所に「存在しない」ため、これはJavaScriptのようなものでは機能しません。
複数のプロジェクトで使用するために、共有JavaScriptファイルの単一バージョンを保持することについて誰か提案がありますか?
結局、これが私がそれを達成した方法です。みんなの好みではないかもしれませんが、私にとってはおやつでした。
注:すべてのプロジェクトで、静的リソースは「Assets」というルートディレクトリにあるため、たとえばJavaScriptは常に/ Assets/js /およびCSS/Assets/css /にあります。
解決策
プロジェクトがビルドされると、インポートされたファイルが\ bin\Assets\jsにコピーされます(ビルド後のイベントは、サイトがそれらを使用するのに間に合うように、それらのコピーをプロジェクトディレクトリに転送します)。
私はこの問題が古くからあることを知っていますが、それでもbeardtwizzleの問題よりも少し単純なので、私の解決策を提案したいと思いました。
.csprojファイルの最後にこれを追加することで、VisualStudioがすべてのリンクファイルをVisualStudioのソリューションエクスプローラーでリンクを配置した場所に確実にコピーできます。
<Target Name="CopyLinkedContentFiles" BeforeTargets="Build">
<Copy SourceFiles="%(Content.Identity)"
DestinationFiles="%(Content.Link)"
SkipUnchangedFiles='true'
OverwriteReadOnlyFiles='true'
Condition="'%(Content.Link)' != ''" />
</Target>
これがどのように機能するかについては、ブログ投稿 http://mattperdeck.com/post/Copying-linked-content-files-at-each-build-using-MSBuild.aspx で説明しました。
正しい解決策は、プロジェクトにjavascript/cssファイルを埋め込むことです。 WebResources.axd を使用してこれを行うことができます。これは、Microsoftがコントロールにjsを埋め込む公式の方法です。 (検証コントロールのように)
あなたは上の良いチュートリアルを見つけることができます: http://www.4guysfromrolla.com/articles/080906-1.aspx
この質問は古くからあることもわかりますが、2セント追加すると思いました...
別のプロジェクトにjavascriptファイルがあります。リンクされた参照を追加しましたが、これは公開には適していますが、IIS ExpressまたはCasinniでは機能しません。カスタムルーティングを追加して不足しているファイルをキャッチし、手動で再マップしようとしましたが、ちょっとしたハックで、MVC 5.1にアップグレードすると何らかの理由で機能しなくなったので、ハックを修正するのではなく、より良い方法を見つけました。
System.Web.Optimization
にはjavascriptバンドルがあります。
共有プロジェクトで、jsファイルのCopy To Output Directory
を「常にコピー」に設定し、Build Action
を「コンテンツ」に設定します。これは、jsファイルが最終的にWebサイトプロジェクトのbinフォルダーに保存されることを意味します。そこから提供することはできませんが(IISは、明らかなセキュリティ上の理由からbinフォルダーには何も提供しません)、バンドルに含めることはできます。
using System.Web;
using System.Web.Optimization;
public class BundleConfig
{
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/externalLibrary").Include(
"~/bin/scripts/externalLibrary.js"
));
}
}
次に、これをglobal.asaxファイルのApplication_Startに追加する必要があります(ルートの登録のすぐ隣)
BundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
次に、バンドルを使用して、これをかみそりcshtmlにリンクします。
<script type='text/javascript' src='@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/externalLibrary")'></script>
Microsoft.aspnet.web.optimization のnugetパッケージが必要になります
素晴らしい質問です。私はこれについてかなり前から考えていました。私の頭に浮かんだ唯一の解決策は、Web上でファイルをホストし、それらをcdnのように使用するか、シンボリックリンクを使用することです。 Visual Studioにコードスニペットを追加して、それらを参照することができます。
このブログ投稿では、@ beardtwizzleによる回答の代替ソリューションについて説明しています。
考え方は似ています:
したがって、ビルド後のイベントの代わりに、ファイルは変更されたビルドステップによってコピーされます。私にとって、このソリューションは少しすっきりしているように感じます(しかし、これは好みの問題かもしれません)。とにかく、これをソリューションに追加したところ、これまでのところうまく機能しています。
おそらく使用できます ビジュアルスタジオテンプレート
将来、この質問に出くわした人は、この問題を解決するための共有プロジェクトがVisualStudioにあることを知っておく必要があります。ユニバーサルWindowsプロジェクトはデフォルトでそれらを使用し、VS拡張機能をここからダウンロードしてインストールすることで独自のプロジェクトを作成できます: https://visualstudiogallery.msdn.Microsoft.com/315c13a7-2787-4f57-bdf7-adae6ed5445
拡張機能をダウンロードしたら、ソリューションに共有プロジェクト(空)を追加できます。プロジェクトは、Visual C#、Visual C++、およびJavaScriptのプロジェクトテンプレートにあります。
次に、共有プロジェクトに共有するファイルを、適切なフォルダー構造に含めます。
次に、共有ファイルへのアクセスが必要なソリューション内の他のプロジェクトに、共有参照として共有プロジェクトを含めます。他のプロジェクトを右クリックして、「共有プロジェクト参照の追加」を選択します。
これで、共有プロジェクトのファイルがそこに存在するかのように、メインプロジェクトの共有ファイルを参照できます。それらはそのプロジェクトの一部としてコンパイルされます。
このテクノロジは、ユニバーサルアプリがWindowsPhoneアプリとWindowsストアアプリの間でコードを共有することを目的としていたため、さまざまなシナリオで共有に問題が発生する可能性があることに注意してください。