ฉันจะแยกโฟลเดอร์ออกจากโปรเจ็กต์แต่ไม่รวมจากการเผยแพร่ได้อย่างไร

ฉันได้ย้ายโปรเจ็กต์หลัก asp.net ไปยัง VS2017 RC แล้ว ซึ่งตอนนี้รองรับความสามารถในการแยกไฟล์ออกจากโปรเจ็กต์แล้ว ฉันได้ยกเว้นสองโฟลเดอร์ซึ่งเพิ่มบรรทัดเหล่านี้ลงในไฟล์ csproj ของฉัน:

<ItemGroup>
  <Content Remove="wwwroot\dist\**" />
  <Content Remove="wwwroot\lib\**" />
</ItemGroup>

ใช้งานได้ดี ยกเว้นตอนนี้ไฟล์เหล่านั้นไม่ได้รับการเผยแพร่อีกต่อไป ฉันจะแยกโฟลเดอร์เหล่านี้ออกจากโปรเจ็กต์แต่ยังคงรวมไว้ในการเผยแพร่ได้อย่างไร


person Eric B    schedule 23.01.2017    source แหล่งที่มา
comment
ถามคำถามว่าทำไมคุณถึงต้องการให้พวกเขาแยกออกจากโครงการถ้าคุณต้องการให้พวกเขาเผยแพร่?   -  person DavidG    schedule 23.01.2017
comment
@DavidG เพื่อที่ Visual Studio จะไม่ถูกหยิบขึ้นมาในไฟล์ แสดงใน Solution Explorer ฯลฯ เป็นไฟล์ javascript/css ที่ย่อขนาดและไลบรารีภายนอก   -  person Eric B    schedule 23.01.2017
comment
อาจจะดีกว่าถ้าซ่อนพวกมันไว้ DnxInvisibleFolder ยังทำงานอยู่หรือไม่ ตัวอย่างเช่น: <ItemGroup><DnxInvisibleFolder Include="wwwroot\dist\" /></ItemGroup> แม้ว่าฉันจะยังไม่เข้าใจว่าเหตุใดคุณถึงสนใจที่จะไม่แสดงพวกเขาในนั้น   -  person DavidG    schedule 23.01.2017
comment
ไม่นั่นไม่ได้ผล ฉันสนใจเนื่องจากการค้นหา Visual Studio ในไฟล์อาจใช้เวลานานและส่งกลับผลลัพธ์หลายร้อยรายการสำหรับสตริงการค้นหาจากไลบรารีภายนอกหรือไฟล์ที่ย่อขนาด   -  person Eric B    schedule 23.01.2017
comment
คุณสามารถคลิกขวาที่โฟลเดอร์ใน VS และซ่อนมันได้หรือไม่? นั่นคือวิธีการทำงานก่อนหน้านี้   -  person DavidG    schedule 23.01.2017
comment
ใช่ ซึ่งส่งผลให้บรรทัดในคำถามของฉันถูกลบออกจากการเผยแพร่ด้วย   -  person Eric B    schedule 23.01.2017
comment
ใน pre-csproj มีตัวเลือกซ่อนที่แตกต่างจากการลบออก   -  person DavidG    schedule 23.01.2017


คำตอบ (3)


รายการ msbuild ต่อไปนี้ที่นำมาจากเทมเพลตสปาใหม่ของ dotnet ช่วยให้ฉันบรรลุสิ่งที่ฉันเชื่อว่าคุณต้องการ:

<ItemGroup>
    <Content Remove="wwwroot\dist\**" />
    <Content Remove="wwwroot\lib\**" />
</ItemGroup>

<Target Name="GiveAName" AfterTargets="ComputeFilesToPublish">
    <!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
    <Exec Command="npm install" />
    <Exec Command="npm etc etc do your stuff" />
    <Exec Command="or webpack" />

    <!-- Include the newly-built files in the publish output -->
    <ItemGroup>
        <DistFiles Include="wwwroot\dist\**; wwwroot\lib\**" />
        <ResolvedFileToPublish Include="@(DistFiles-&gt;'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
            <RelativePath>%(DistFiles.Identity)</RelativePath>
            <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        </ResolvedFileToPublish>
    </ItemGroup>
</Target>
person Gonzalo Lucero    schedule 08.06.2017
comment
ฉันเพิ่งทดสอบสิ่งนี้ใน VS2017 (v15.3.5) และใช้งานได้ ขอบคุณ! ตามหมายเหตุด้านข้าง ฉันลบสิ่ง npm ออกเนื่องจากฉันไม่ต้องการมัน - person Judah Gabriel Himango; 03.10.2017
comment
ไม่ต้องห่วง. โปรดทราบว่าฉันยังลบคำสั่ง npm ออกด้วยและพบว่ามีประสิทธิภาพมากกว่ามากในการจัดการงานส่วนหน้านอก VS - person Gonzalo Lucero; 04.10.2017
comment
ฉันกำลังพยายามทำให้สิ่งนี้ใช้งานได้ แต่สำหรับไดเร็กทอรีบิวด์ npm นอกโปรเจ็กต์ .net ของฉัน (แบ็กเอนด์อยู่ในโฟลเดอร์เดียวและในระหว่างการปรับใช้ จะรวมทรัพยากร UI จากโฟลเดอร์ที่สอง) นั่นคือไฟล์ dist ของฉันดูเหมือน ‹DistFiles Included=..\..\src-app\www\dist**; /› แต่ฉันกำลังดิ้นรนเพื่อให้ได้ผลลัพธ์ใด ๆ ที่รวบรวม... ฉันไม่เข้าใจไวยากรณ์ของ inlcude distfiles -› fullpath ?? มีใครลองใช้โครงสร้างโฟลเดอร์นี้บ้างไหม? - person Dale Holborow; 08.12.2017

ฉันแก้ไขปัญหานี้โดยเพิ่มบรรทัดต่อไปนี้ลงในเป้าหมาย PrepublishScript ในไฟล์ csproj เนื่องจากดูเหมือนจะยังไม่มีวิธีที่สวยงามในการทำสิ่งนี้

<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish" Condition=" '$(IsCrossTargetingBuild)' != 'true' ">
  <!-- Other things here already -->
  <ItemGroup>
    <Lib Include="wwwroot/lib/**;" />
    <Dist Include="wwwroot/dist/**;" />
  </ItemGroup>
  <Copy SourceFiles="@(Lib)" DestinationFolder="$(PublishDir)\wwwroot\lib\%(RecursiveDir)" SkipUnchangedFiles="true" />
  <Copy SourceFiles="@(Dist)" DestinationFolder="$(PublishDir)\wwwroot\dist\%(RecursiveDir)" SkipUnchangedFiles="true" />
</Target>
person Eric B    schedule 25.01.2017
comment
ดูเหมือนว่าโค้ดตัวอย่างจะคาดหวังเป้าหมาย PrepublishScript ใน csproj เทมเพลตแอปเว็บ ASP.NET Core ไม่มีสิ่งนี้ ในกรณีเช่นนี้ คุณจะเพิ่มมันเข้าไปในองค์ประกอบ Project หรือไม่? - person Edward Brey; 04.07.2017

คุณอาจสามารถตอบสนองความต้องการของคุณด้วย Condition เช่น:

<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
  <Content Remove="wwwroot\dist\**" />
  <Content Remove="wwwroot\lib\**" />
</ItemGroup>

แก้ไข:

หรืออาจลอง:

<ItemGroup>
  <Content Condition=" '$(Configuration)' == 'Debug'" Remove="wwwroot\dist\**" />
  <Content Condition=" '$(Configuration)' == 'Debug'" Remove="wwwroot\lib\**" />
</ItemGroup>

แก้ไข 2:

เนื่องจากดูเหมือนว่า IDE จะต้องเคารพ Condition คุณจึงสามารถเปลี่ยนรายการจาก Content เป็น None แทน และเพิ่มเป้าหมาย BeforePublish ที่เพิ่มรายการ Content ที่เทียบเท่ากัน

แก้ไข 3:

เพื่อให้เจาะจง เก็บต้นฉบับของคุณไว้

<ItemGroup>
  <Content Remove="wwwroot\dist\**" />
  <Content Remove="wwwroot\lib\**" />
</ItemGroup>

และเพิ่มก่อน </Project>

<Target Name="BeforePublish">
  <ItemGroup>
    <Content Include="wwwroot\dist\**" />
    <Content Include="wwwroot\lib\**" />
  </ItemGroup>
</Target>
person weir    schedule 24.01.2017
comment
Visual Studio 2017 Solution Explorer ละเว้น Condition? ฉันคิดว่าฉันไม่ควรแปลกใจ ฉันเพิ่มรูปแบบในกรณีที่มันชักชวนพฤติกรรมที่ต้องการจาก IDE แต่ฉันสงสัยว่ามันจะเป็นเช่นนั้น :( - person weir; 25.01.2017
comment
ลองแล้วและการเผยแพร่ใน Visual Studio ล้มเหลวในการคัดลอก wwwroot เลยและการใช้ dotnet publish ยังคงแยก dist และ lib แม้จะมีเป้าหมาย BeforePublish - person Eric B; 25.01.2017
comment
คุณสามารถระบุบรรทัด ‹Content รวม อื่นๆ ที่อยู่ในไฟล์โครงการได้หรือไม่ - person weir; 25.01.2017
comment
ไม่มีเนื้อหาอื่นรวมหรือลบบรรทัด - person Eric B; 25.01.2017
comment
ลองเปลี่ยนชื่อเป้าหมายจาก BeforePublish เป็น BeforeBuild - person weir; 25.01.2017