קבצים סטטיים ב ASP Core
-
שרת שניגש לקובץ סטטי על הדיסק ומנתח אותו,
בקובץ CSPROJ הוסיפו לקימפול תיקיה
<ItemGroup> <Folder Include="files\" /> </ItemGroup>
ושם אמורים להיות הקבצים הסטטיים
איך אמורים לכתוב את הנתיב לקובץ הזה? הרי אחרי הקימפול אין היררכיה של קבצים כמו שיש בסביבת הפיתוח, כל הקבצים יוצאים בתיקיה אחת שטוחה.
-
ראשית תוסיף את המילה core בכותרת, אתה אף פעם לא יכול לנחש איך שינוי ניסוח טכני יכול להיות משמעותית רגשית לאנשים
אחרי הקימפול אין היררכיה של קבצים כמו שיש בסביבת הפיתוח, כל הקבצים יוצאים בתיקיה אחת שטוחה
ככה זה לקבצי הריצה בברירת מחדל, זה ודאי לא מוכרח להיות ככה.
ברור שאם יש צורך אמורים יכולים לכלול את התיקיה עצמה ולא רק את הקבצים.
אולי זה https://stackoverflow.com/q/54762744/1271037כמובן שאתה יכול להתנות את הנתיב במצב הריצה, אבל לדעתי אידאלית שמבנה הקבצים זהה לחלוטין.
-
שים לב שהMSBuild item המכונה
Folder
הוא משתנה שרירותי המייצג קבצים (באותה מידה יכולת להשתמש עם תג בשםNiceFolder
) כל עוד לא הItem אינו מועבר כפרמטר לTask כלשהוא, לא יתרחש עם הקבצים שהוא מייצג דבר.בניגוד ל:
- Compile
- Content (האפשרות הרצויה במקרה שלך)
- None
- EmbeddedResource ועוד.
המייצגים Build Actions בMSBuild
לכל Framework בNet. יש Target המייצג את פעולת הBuild (הTarget הנ"ל אינו מופיע בקובץ הפרויקט אולם ניתן להתייחס אליו בתזמון Targets נוספים, למשל לMSBuild item בשם Page יש משמעות מיוחדת רק בBuild של WPF), לMSBuild item בשםFolder
אין כל משמעות בBuild של Asp.
לשם ההדגמה, להלן Target המכיל שלושה Tasks (המשימה: ביצוע Build של פרויקט כלשהוא והעתקת התוצאה לנתיב שרירותי כלשהוא במערכת הקבצים)
- MSBuild מייצג Build של קובץ MSBuild אחר (במקרה זה אנחנו מבצעים Build לפרויקט X)
- MakeDir מייצג Task היוצר תיקייה (אנחנו משתמשים בPropertyGroup בשם Destination כדי לקבוע את היעד)
- Copy מייצג Task המעתיק קבצים (אנחנו משתמשים בItemGroup השרירותי
MySourceFiles
על מנת לקבוע את הקבצים שיועתקו (במקרה זה התוצאה של משימה 1) ובPropertyGroup בשםDestination
על מנת לקבוע את היעד)
<Target Name="BuildProjectAndCopyFiles" AfterTargets="BeforeBuild"> <PropertyGroup> <MyDestination>\SomePath</MyDestination> </PropertyGroup> <ItemGroup> <MySourceFiles Include="ProjectName\bin\$(Platform)\$(Configuration)\$(TargetFramework)\$(RuntimeIdentifier)\**\*.*" /> </ItemGroup> <MSBuild Projects="ProjectName\ProjectName.csproj" Targets="Build" Properties="Configuration=$(Configuration);Platform=$(Platform)"/> <MakeDir Directories="$(MyDestination)" /> <Copy SourceFiles="@(MySourceFiles)" DestinationFolder="$(MyDestination)\%(RecursiveDir)" SkipUnchangedFiles="true" /> </Target>
כאן ניתן למצוא את הרשימה המלאה של הTasks המובנים בMSbuild
לסיכום:
הBuild Action הרצוי עבור קבצים סטטים הוא Content, הקבצים יועתקו לשורש תיקיית היעד תוך שמירה על ההיררכיה המקורית:
<ItemGroup> <Content Include="files\**" /> </ItemGroup>
הקבצים בתיקיית
files
יהיו זמינים בנתיב הבא:new Uri("files/somefile.xyz")
** שים לב שהתהליך הנ"ל מתבצע בASP אוטומטית עבור התיקייה
wwwroot
.** כאן ניתן הסבר בהרחבה כיצד לחשוף קבצים סטטים מחוץ לתיקיית
wwwroot
לבקשות HTTP באמצעות ASP.