שים לב שה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.