MSBuild ไม่ได้คัดลอกข้อมูลอ้างอิง (ไฟล์ DLL) หากใช้การอ้างอิงโครงการในการแก้ปัญหา


273

ฉันมีสี่โครงการในโซลูชัน Visual Studio ของฉัน (ทุกคนกำหนดเป้าหมาย. NET 3.5) - สำหรับปัญหาของฉันมีเพียงสองโครงการเท่านั้นที่สำคัญ:

  1. MyBaseProject <- ไลบรารีคลาสนี้อ้างอิงถึงไฟล์ DLL ของบุคคลที่สาม (elmah.dll)
  2. MyWebProject1 <- โครงการเว็บแอปพลิเคชันนี้มีการอ้างอิงถึง MyBaseProject

ฉันเพิ่มการอ้างอิงelmah.dllในMyBaseProjectใน Visual Studio 2008 โดยคลิกที่ "เพิ่มการอ้างอิง ... " → "เรียกดู" แท็บ→เลือก "elmah.dll"

คุณสมบัติของการอ้างอิง Elmah มีดังนี้:

  • นามแฝง - ทั่วโลก
  • คัดลอกภายใน - จริง
  • วัฒนธรรม -
  • คำอธิบาย - ข้อผิดพลาดการบันทึกโมดูลและตัวจัดการ (ELMAH) สำหรับ ASP.NET
  • ประเภทไฟล์ - การประกอบ
  • เส้นทาง - D: \ webs \ otherfolder \ _myPath \ __ tools \ elmah \ Elmah.dll
  • แก้ไขแล้ว - จริง
  • เวอร์ชันรันไทม์ - v2.0.50727
  • รุ่นที่ระบุ - เท็จ
  • ชื่อที่แข็งแกร่ง - เท็จ
  • รุ่น - 1.0.11211.0

ในMyWebProject1ฉันเพิ่มการอ้างอิงไปยังโครงการ MyBaseProject โดย: "เพิ่มการอ้างอิง ... " → "แท็บ" โครงการ "→เลือก" MyBaseProject " คุณสมบัติของการอ้างอิงนี้เหมือนกันยกเว้นสมาชิกต่อไปนี้:

  • คำอธิบาย -
  • เส้นทาง - D: \ webs \ CMS \ MyBaseProject \ bin \ Debug \ MyBaseProject.dll
  • เวอร์ชั่น - 1.0.0.0

ถ้าฉันเรียกใช้บิลด์ในVisual Studioไฟล์ elmah.dll จะถูกคัดลอกไปยังไดเรกทอรีbin ของ MyWebProject1พร้อมกับ MyBaseProject.dll!

อย่างไรก็ตามถ้าฉันทำความสะอาดและเรียกใช้MSBuildสำหรับการแก้ปัญหา (ผ่าน D: \ webs \ CMS> C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / t: ReBuild / p: การกำหนดค่า = Debug MyProject.sln ) elmah.dll จะหายไปในไดเรกทอรี bin ของ MyWebProject1 - แม้ว่า build จะไม่มีคำเตือนหรือข้อผิดพลาด!

ฉันได้ทำให้แน่ใจว่า. csproj ของ MyBaseProject มีองค์ประกอบส่วนตัวที่มีค่า "จริง" (ที่ควรจะเป็นนามแฝงสำหรับ " คัดลอกท้องถิ่น " ใน Visual Studio):

<Reference Include="Elmah, Version=1.0.11211.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\mypath\__tools\elmah\Elmah.dll</HintPath>
    **<Private>true</Private>**
</Reference>

(แท็กส่วนตัวไม่ปรากฏใน xml ของ. csproj โดยค่าเริ่มต้นถึงแม้ว่า Visual Studio จะพูดว่า "copy local" จริงฉันเปลี่ยน "copy local" เป็น false - บันทึก - และตั้งค่ากลับเป็นจริงอีกครั้ง - บันทึก!)

เกิดอะไรขึ้นกับ MSBuild ฉันจะรับการอ้างอิง (elmah.dll) ที่คัดลอกไปยังถังขยะของ MyWebProject1 ได้อย่างไร

ฉันไม่ต้องการเพิ่มการดำเนินการคัดลอก postbuild ให้กับคำสั่ง postbuild ของทุกโครงการ! (ลองนึกภาพฉันจะมีหลายโครงการขึ้นอยู่กับ MyBaseProject!)


11
ฉันชอบที่จะได้คำตอบที่ชัดเจนว่าทำไมสิ่งนี้ถึงเกิดขึ้น
David Faivre

1
ลองดูคำตอบที่ให้ไว้ที่นี่
Anuroopa Shenoy

1
โซลูชันสุดท้ายใดที่มีตัวอย่างซอร์สโค้ดเต็มรูปแบบทำงานเกี่ยวกับมัน
Kiquenet

2
ดูคำตอบstackoverflow.com/a/21055664/21579ด้านล่างโดย @deadlydog คำอธิบายที่ยอดเยี่ยมและแก้ไขปัญหาสำหรับฉัน ... คำตอบที่โหวตแล้วด้านล่างไม่ถูกต้องสำหรับ VS2012
Jeff Widmer

2
ลงคะแนนในส่วนนี้connect.microsoft.com/VisualStudio/feedback/details/652785/…
Zack

คำตอบ:


153

ฉันไม่แน่ใจว่าทำไมมันแตกต่างเมื่อสร้างระหว่าง Visual Studio และ MsBuild แต่นี่คือสิ่งที่ฉันพบเมื่อฉันพบปัญหานี้ใน MsBuild และ Visual Studio

คำอธิบาย

สำหรับสถานการณ์ตัวอย่างสมมติว่าเรามีโปรเจ็กต์ X แอสเซมบลี A และแอสเซมบลี B แอสเซมบลีอ้างอิง B แอสเซมบลีดังนั้นโครงการ X รวมการอ้างอิงถึงทั้ง A และ B นอกจากนี้โปรเจ็กต์ X someFunction ()) ตอนนี้คุณสร้างโครงการใหม่ Y ซึ่งอ้างอิงโครงการ X

ดังนั้นห่วงโซ่การพึ่งพามีลักษณะเช่นนี้: Y => X => A => B

Visual Studio / MSBuild พยายามที่จะฉลาดและนำการอ้างอิงเข้าสู่โครงการ Y ที่ตรวจพบว่าเป็นโครงการ X ที่ต้องการ มันทำเช่นนี้เพื่อหลีกเลี่ยงมลภาวะอ้างอิงในโครงการ Y ปัญหาคือเนื่องจากโครงการ X ไม่มีรหัสใด ๆ ที่ใช้ชุดประกอบ B (เช่น B.SomeFunction ()) อย่างชัดเจน VS / MSBuild ตรวจไม่พบว่าจำเป็นต้องใช้ B โดย X และดังนั้นจึงไม่คัดลอกลงในไดเรกทอรี bin ของโครงการ Y คัดลอกชุดประกอบ X และ A เท่านั้น

สารละลาย

คุณมีสองตัวเลือกในการแก้ปัญหานี้ซึ่งทั้งสองอย่างนี้จะส่งผลให้แอสเซมบลี B ถูกคัดลอกไปยังไดเรกทอรี bin ของโครงการ Y:

  1. เพิ่มการอ้างอิงถึงแอสเซมบลี B ในโครงการ Y
  2. เพิ่มรหัสจำลองไปยังไฟล์ในโครงการ X ที่ใช้ชุดประกอบ B

ส่วนตัวแล้วฉันชอบตัวเลือกที่ 2 ด้วยเหตุผลสองสามข้อ

  1. หากคุณเพิ่มโครงการอื่นในอนาคตที่อ้างอิงโครงการ X คุณไม่จำเป็นต้องใส่การอ้างอิงไปยังชุดประกอบ B (เช่นเดียวกับที่คุณต้องทำกับตัวเลือกที่ 1)
  2. คุณสามารถแสดงความคิดเห็นอย่างชัดเจนว่าทำไมต้องมีรหัสหุ่นจำลองและไม่ลบออก ดังนั้นหากใครบางคนลบรหัสโดยไม่ตั้งใจ (พูดด้วยเครื่องมือ refactor ที่มองหารหัสที่ไม่ได้ใช้) คุณสามารถเห็นได้จากแหล่งควบคุมที่ต้องการรหัสและเรียกคืนได้อย่างง่ายดาย หากคุณใช้ตัวเลือกที่ 1 และบางคนใช้เครื่องมือ refactor เพื่อล้างข้อมูลอ้างอิงที่ไม่ได้ใช้คุณจะไม่มีความคิดเห็นใด ๆ คุณจะเห็นว่าการอ้างอิงถูกลบออกจากไฟล์. csproj

นี่คือตัวอย่างของ "รหัสจำลอง" ที่ฉันมักจะเพิ่มเมื่อฉันพบสถานการณ์นี้

    // DO NOT DELETE THIS CODE UNLESS WE NO LONGER REQUIRE ASSEMBLY A!!!
    private void DummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE()
    {
        // Assembly A is used by this file, and that assembly depends on assembly B,
        // but this project does not have any code that explicitly references assembly B. Therefore, when another project references
        // this project, this project's assembly and the assembly A get copied to the project's bin directory, but not
        // assembly B. So in order to get the required assembly B copied over, we add some dummy code here (that never
        // gets called) that references assembly B; this will flag VS/MSBuild to copy the required assembly B over as well.
        var dummyType = typeof(B.SomeClass);
        Console.WriteLine(dummyType.FullName);
    }

4
สิ่งที่ไม่ได้กล่าวถึงในที่นี้คือมีความแตกต่างระหว่างการคัดลอกผลิตภัณฑ์บิลด์ใน / bin ของโครงการเว็บและการคัดลอกประจำไปยังไดเรกทอรีเอาต์พุตเป้าหมาย (เช่น / bin / x86 / Debug) อดีตจะทำโดยโครงการอ้างอิงเมื่อสร้างและหลังจะทำโดยโครงการเว็บขึ้นอยู่กับ การตรวจสอบ Microsoft.Common.targets ช่วยให้เข้าใจสิ่งนี้ การคัดลอกไปยังเว็บ / bin ไม่ได้ขึ้นอยู่กับการคัดลอกพฤติกรรมในท้องถิ่นเลย - คัดลอกผลกระทบภายในเครื่องกับการคัดลอกไปยัง dir เป้าหมายผลลัพธ์ซึ่งไม่ได้เป็นส่วนหนึ่งของโครงสร้างที่ Cassini เรียกใช้ผ่าน Debug
user1164178

6
คุณช่วยอธิบายได้ไหมว่าทำไมมันถึงได้ทำงานกับ VS โดยไม่ต้องเพิ่ม "รหัสจำลอง" แต่ไม่ใช่กับ msbuild?
toebens

3
แม้แต่การบุกรุกที่น้อยกว่าการเรียกใช้ฟังก์ชันคุณสามารถกำหนดประเภทของคลาสที่มีอยู่ภายในแอสเซมบลีให้กับตัวแปรดัมมี่ Type dummyType = typeof(AssemblyA.AnyClass);
Arithmomaniac

14
โซลูชัน # 2 ดังที่แสดงด้านบนจะใช้งานได้เว้นแต่ว่าคุณได้ตั้งค่า 'เพิ่มประสิทธิภาพโค้ด' ไว้ใน Visual Studio ในกรณีนั้นมันจะยังคงแยก dll ฉันเพิ่มอีกหนึ่งบรรทัดเพื่อแทนที่ "การเพิ่มประสิทธิภาพ" Console.WriteLine(dummyType.FullName);
JasonG

3
โซลูชันที่ 2 ไม่ได้ผลสำหรับฉันใน Visual Studio 2017 ฉันแรกคิดว่าเป็นเพราะในแอสเซมบลี X ของฉันฉันใช้เพียงenumจาก B เท่านั้นและฉันคิดว่า enum กำลังอินไลน์ ฉันเพิ่มรหัสเพื่อใช้ประเภทจาก B โดยตรงและนั่นไม่ได้ช่วย มันเป็นเช่นนี้เสมอในกรณีที่ X ของฉันใช้ชนิดใน A ซึ่งเป็นประเภทรองใน B ดังนั้นฉันจึงไม่สามารถเข้าใจได้ว่าคอมไพเลอร์คิดว่า B ไม่จำเป็นต้องใช้โดย X และสามารถเพิกเฉยได้ นี่คือ bonkers
Xharlie

170

ฉันแค่จัดการกับมันอย่างนี้ ไปที่คุณสมบัติของการอ้างอิงของคุณและทำสิ่งนี้:

Set "Copy local = false"
Save
Set "Copy local = true"
Save

และนั่นคือมัน

Visual Studio 2010 ไม่ได้ใส่ <private>True</private> ในแท็กอ้างอิงและการตั้งค่า "คัดลอกภายใน" เป็นเท็จทำให้เกิดการสร้างแท็ก หลังจากนั้นมันจะตั้งค่าเป็นจริงและเท็จตามลำดับ


10
นี่คือสวรรค์ ขอบคุณสำหรับสิ่งนี้!
รีเบคก้า

22
ไม่ได้ผลสำหรับฉันกับ MSBuild 4 / VS2012 นั่นคือฉันสามารถอัปเดตข้อมูลอ้างอิงเพื่อพูด<Private>true</Private>แต่ดูเหมือนว่าจะไม่มีผลกับ MSBuild ในตอนท้ายฉันเพิ่งเพิ่มการอ้างอิง NuGet ไปยังโครงการระดับล่าง
Michael Teper

2
ไม่ได้ผลสำหรับฉัน มันยังไม่คัดลอก System.Net.Http.Formatting ไปยังโฟลเดอร์ bin
อากิระยามาโมโตะ

4
มันเทียบเท่ากับHave you tried turning it off and on again?และมันใช้งานได้!
guanome

6
ดูเหมือนว่า VS2015 จะยังคงทำงานเหมือนเดิม: ตั้งค่า 'คัดลอก Local' เป็น 'False' จากนั้นกลับสู่ 'True' ตามการอ้างอิงของ. dll ที่ใช้งานได้
พลิก

38

หากคุณไม่ได้ใช้แอสเซมบลีโดยตรงในรหัส Visual Studio ในขณะที่พยายามที่จะเป็นประโยชน์ตรวจพบว่ามันไม่ได้ใช้และไม่รวมไว้ในผลลัพธ์ ฉันไม่แน่ใจว่าทำไมคุณถึงเห็นพฤติกรรมที่แตกต่างระหว่าง Visual Studio และ MSBuild คุณสามารถลองตั้งค่าผลลัพธ์การสร้างเป็นการวินิจฉัยสำหรับทั้งสองและเปรียบเทียบผลลัพธ์ดูที่มันแตกต่าง

ในฐานะที่เป็นสำหรับการอ้างอิง elmah.dll ของคุณถ้าคุณไม่ได้อ้างอิงโดยตรงในรหัสคุณอาจจะเพิ่มเป็นรายการให้กับโครงการของคุณและตั้งค่าการดำเนินการสร้างContentและคัดลอกไปเอาท์พุท Directory Alwaysเพื่อ


3
+1 สำหรับความคิดเห็นคัดลอกของคุณไปยังไดเรกทอรีไดเรกทอรีความคิดเห็นหาก Elmah ไม่ได้ถูกใช้ในรหัสให้ทำการคัดลอกเป็นเนื้อหา
Kit Roed

4
อันที่จริงมันไม่สนใจแอสเซมบลีที่ไม่ได้ใช้ แต่สิ่งสำคัญอย่างหนึ่งที่ควรสังเกตตั้งแต่ VS 2010 ที่ใช้แอสเซมบลีในพจนานุกรมทรัพยากร XAML ไม่ถือเป็นการใช้ assmebly โดย VS ดังนั้นจึงจะไม่คัดลอก
Alex Burtsev


นี้จะดีกว่าสำหรับโครงการทดสอบหน่วยที่ฉันต้องการ dll ฉันไม่ต้องการเพิ่ม dll ที่โครงการหลักไม่ต้องการเพียงเพื่อให้การทดสอบทำงาน!
Lukos

14

ดูที่:

กระทู้ในฟอรัม MSBuild นี้ฉันเริ่มต้นขึ้น

คุณจะพบวิธีแก้ปัญหาชั่วคราว / วิธีแก้ปัญหาของฉันที่นั่น!

(MyBaseProject ต้องการรหัสบางอย่างที่อ้างอิงบางคลาส (อะไรก็ตาม) จาก elmah.dll สำหรับ elmah.dll ที่ถูกคัดลอกไปยังถังขยะของ MyWebProject1!)


1
ประณาม - นี่เป็นทางออกเดียวที่ฉันได้มาด้วยหวังว่าอาจมีวิธีที่ดีกว่าที่จะทำ!
nickspoon

2
ดูคำตอบของแอนดรูด้านล่างเพื่อแก้ปัญหา
แฮ็

1
สำหรับผู้ที่กำลังมองหาที่ตอนนี้คำตอบ toebens'ใน MSDN เป็นหลักเช่นเดียวกับคำตอบของ deadlydogให้หลายปีต่อมา
jpaugh

8

ผมมีปัญหาเหมือนกัน.

ตรวจสอบว่าเวอร์ชันเฟรมเวิร์กของโครงการของคุณเหมือนกันกับเวอร์ชันเฟรมเวิร์กของ dll ที่คุณใช้อ้างอิง

ในกรณีของฉันไคลเอนต์ของฉันถูกคอมไพล์โดยใช้ "Framework 4 Client" และ DLL อยู่ใน "Framework 4"


6

ปัญหาที่ฉันเผชิญคือฉันมีโครงการที่ขึ้นอยู่กับโครงการห้องสมุด เพื่อที่จะสร้างฉันทำตามขั้นตอนเหล่านี้:

msbuild.exe myproject.vbproj /T:Rebuild
msbuild.exe myproject.vbproj /T:Package

แน่นอนหมายความว่าฉันพลาดไฟล์ dll ของไลบรารี่ใน bin และที่สำคัญที่สุดคือไฟล์ zip ของแพ็คเกจ ฉันพบว่ามันใช้งานได้อย่างสมบูรณ์แบบ:

msbuild.exe myproject.vbproj /T:Rebuild;Package

ฉันไม่รู้ว่าทำไมงานนี้หรือทำไมจึงไม่ทำงานตั้งแต่แรก แต่หวังว่าจะช่วย


ฉันมีปัญหาเดียวกันในการสร้างโซลูชันทั้งหมดโดยใช้ / t: Build จาก TeamCity ในขั้นตอนเดียวแล้วในถัดไป / t: แพ็คเกจบนโครงการ WebAPI Dll ใด ๆ ที่อ้างอิงโดยการอ้างอิงโครงการใด ๆ ไม่รวมอยู่ด้วย นี้ได้รับการแก้ไขโดยใช้ข้างต้น - / T: สร้างใหม่แพคเกจบน WebAPI แล้วรวมที่กำลังเหล่านั้น
Andy Hoyle

5

ฉันเพิ่งมีปัญหาเดียวกันที่แน่นอนและปรากฎว่าเกิดจากความจริงที่ว่า 2 โครงการในโซลูชันเดียวกันกำลังอ้างอิงรุ่นห้องสมุดบุคคลที่สามที่แตกต่างกัน

เมื่อฉันแก้ไขการอ้างอิงทั้งหมดทุกอย่างทำงานได้อย่างสมบูรณ์


4

อย่างที่ Alex Burtsev พูดถึงในคอมเม้นท์อะไรก็ตามที่ใช้ในพจนานุกรมทรัพยากร XAML เท่านั้นหรือในกรณีของฉันสิ่งใดก็ตามที่ใช้ใน XAML เท่านั้นและไม่ได้อยู่ในรหัสข้างหลังไม่ถือว่า MSBuild ใช้งานอยู่

ดังนั้นเพียงแค่การอ้างอิงดัมมี่กับคลาส / ส่วนประกอบในแอสเซมบลีในรหัสบางอย่างด้านหลังใหม่ก็เพียงพอที่จะโน้มน้าวใจ MSBuild ว่าแอสเซมบลีใช้งานจริง


นี่เป็นปัญหาของฉันและวิธีแก้ปัญหาที่ใช้ได้จริง ใช้เวลานานเกินไปในการพยายามคิดออก ขอบคุณ Scott & @Alex Burstev
karol

ความเศร้าโศกที่ดีนี่ทำให้ฉันเป็นบ้า ใช่ผมก็ใช้ FontAwesome.WPF และเพียงจากภายใน XAML (ด้วยเหตุผลที่ชัดเจน) การเพิ่มวิธีการหลอกตาช่วยได้ ขอบคุณ! และใช่ VS 2017 15.6 ยังคงได้รับผลกระทบดังนั้นฉันจึงยื่นข้อผิดพลาด: github.com/dotnet/roslyn/issues/25349
Sören Kuklau

3

การเปลี่ยนกรอบงานเป้าหมายจาก. NET Framework 4 ไคลเอนต์โปรไฟล์เป็น. NET Framework 4แก้ไขปัญหานี้ให้ฉัน

ดังนั้นในตัวอย่างของคุณ: ตั้งค่ากรอบงานเป้าหมายบน MyWebProject1 เป็น. NET Framework 4


3

ใช้รูปแบบของ Deadlydog

Y => X => A => B ,

ปัญหาของฉันคือเมื่อฉันสร้าง Y ชุดประกอบ (A และ B ทั้งหมด 15 รายการ) จาก X ไม่ปรากฏในโฟลเดอร์ช่องเก็บของ Y

ฉันได้รับการแก้ไขโดยลบการอ้างอิง X จาก Y, บันทึก, สร้าง, จากนั้นเพิ่มการอ้างอิง X อีกครั้ง (การอ้างอิงโครงการ), และบันทึก, สร้างและ A และ B เริ่มปรากฏขึ้นในโฟลเดอร์ถังขยะของ Y


หลังจากค้นหาและลองใช้วิธีแก้ปัญหาอื่นอีกหลายชั่วโมง
Suncat2000

2

ฉันมีปัญหาเดียวกันและ dll คือการอ้างอิงโหลดแบบไดนามิก เพื่อแก้ปัญหาฉันได้เพิ่ม "ใช้" กับ namespace ของ dll ตอนนี้ dll จะถูกคัดลอกในโฟลเดอร์ผลลัพธ์



2

แอสเซมบลีที่อ้างอิงที่ไม่ได้ใช้ในระหว่างการสร้างไม่ใช่วิธีปฏิบัติที่ถูกต้อง คุณควรเพิ่มไฟล์บิลด์ของคุณเพื่อที่มันจะคัดลอกไฟล์เพิ่มเติม ไม่ว่าจะโดยใช้เหตุการณ์สร้างโพสต์หรือโดยการอัพเดตกลุ่มคุณสมบัติ

ตัวอย่างบางส่วนสามารถพบได้ในโพสต์อื่น


2

สถานการณ์อื่นที่สิ่งนี้แสดงให้เห็นคือถ้าคุณใช้โครงการ "เว็บไซต์" รุ่นเก่าใน Visual Studio สำหรับประเภทโครงการนั้นไม่สามารถอ้างอิง. dll ที่อยู่นอกโครงสร้างไดเรกทอรีของตัวเอง (โฟลเดอร์ปัจจุบันและลง) ดังนั้นในคำตอบข้างต้นสมมติว่าโครงสร้างไดเรกทอรีของคุณเป็นดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่ ProjectX และ ProjectY เป็นไดเรกทอรีหลัก / ลูกและ ProjectX อ้างอิง A.dll ซึ่งจะอ้างอิง B.dll และ B.dll อยู่นอกโครงสร้างไดเรกทอรีเช่นในแพ็คเกจ Nuget บนรูท (แพ็คเกจ) จากนั้น A. จะรวม dll แต่ B.dll จะไม่


0

ฉันมีปัญหาที่คล้ายกันในวันนี้และแน่นอนที่สุดไม่ใช่คำตอบสำหรับคำถามของคุณ แต่ฉันต้องการที่จะแจ้งให้ทุกคนและอาจให้จุดประกายความเข้าใจ

ฉันมีแอพพลิเคชั่น ASP.NET กระบวนการสร้างถูกตั้งค่าเป็นล้างแล้วสร้าง

ฉันมีสคริปต์Jenkins CIสองตัว หนึ่งสำหรับการผลิตและอีกอันสำหรับจัดเตรียม ฉันปรับใช้แอปพลิเคชันของฉันเพื่อจัดเตรียมและทุกอย่างทำงานได้ดี นำไปใช้กับการผลิตและขาดไฟล์ DLL ที่ถูกอ้างถึง ไฟล์ DLL นี้อยู่ในรากของโครงการ ไม่ได้อยู่ในที่เก็บของ NuGet DLL ถูกตั้งค่าเป็นdo not copyที่ถูกกำหนดให้

สคริปต์ CI และแอปพลิเคชันเหมือนกันระหว่างการปรับใช้สองแบบ หลังจากการล้างและปรับใช้ในสภาพแวดล้อม staging ไฟล์ DLL ถูกแทนที่ในตำแหน่งการปรับใช้ของแอปพลิเคชัน ASP.NET ( bin/) นี่ไม่ใช่กรณีสำหรับสภาพแวดล้อมการผลิต

ปรากฎในสาขาการทดสอบฉันได้เพิ่มขั้นตอนในกระบวนการสร้างเพื่อคัดลอกไฟล์ DLL นี้ไปยังbinไดเรกทอรี ตอนนี้ส่วนที่ใช้เวลาสักครู่เพื่อคิดออก กระบวนการ CI ไม่ได้ทำความสะอาดตัวเอง DLL ถูกทิ้งไว้ในไดเรกทอรีการทำงานและกำลังถูกจัดทำแพคเกจกับไฟล์. zip แบบ ASP.NET โดยไม่ตั้งใจ สาขาการผลิตไม่เคยมีไฟล์ DLL ที่คัดลอกด้วยวิธีเดียวกันและไม่เคยใช้งานโดยไม่ได้ตั้งใจ

TLDR; ตรวจสอบและตรวจสอบให้แน่ใจว่าคุณรู้ว่าเซิร์ฟเวอร์บิลด์ของคุณทำอะไรอยู่


0

ตรวจสอบให้แน่ใจว่าโครงการทั้งสองอยู่ใน. net รุ่นเดียวกันตรวจสอบคุณสมบัติการคัดลอกภายในเครื่องด้วย แต่ควรtrueเป็นค่าเริ่มต้น



-1

ฉันเพิ่งพบปัญหาที่คล้ายกันมาก เมื่อรวบรวมโดยใช้ Visual Studio 2010 ไฟล์ DLL จะรวมอยู่ในbinโฟลเดอร์ แต่เมื่อรวบรวมโดยใช้ MSBuild ไฟล์ DLL ของบุคคลที่สามไม่ได้รวมอยู่

น่าผิดหวังมาก วิธีที่ฉันแก้ไขมันคือการรวมการอ้างอิงNuGetไปยังแพ็คเกจในโครงการเว็บของฉันแม้ว่าฉันจะไม่ได้ใช้มันโดยตรง


นี่เป็นคำตอบที่ซ้ำกัน
ไจล์สโรเบิร์ตส์

-3

การรวมไฟล์ DLL ที่อ้างอิงทั้งหมดจากการตั้งค่าโครงการของคุณในโครงการเว็บไซต์นั้นไม่ใช่ความคิดที่ดีเสมอไปโดยเฉพาะเมื่อคุณใช้การฉีดพึ่งพา : โครงการเว็บของคุณเพียงแค่ต้องการเพิ่มการอ้างอิงไปยังไฟล์ / โครงการ DLL ของอินเตอร์เฟส ไฟล์.

เนื่องจากถ้าคุณเพิ่มการอ้างอิงโดยตรงไปยังไฟล์ / โครงการการใช้งาน DLL คุณไม่สามารถป้องกันนักพัฒนาของคุณจากการเรียก "ใหม่" ในคลาสที่เป็นรูปธรรมของไฟล์ / โครงการการติดตั้ง DLL แทนที่จะเป็นผ่านอินเตอร์เฟส นอกจากนี้คุณยังได้ระบุ "hardcode" ในเว็บไซต์ของคุณเพื่อใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.