2011-12-15 46 views
6

Tôi đã gặp sự cố gần đây với khôi phục NuGet. Tôi đã thêm một phụ thuộc dự án (trong trường hợp này là PostSharp) và sau đó kích hoạt khôi phục. Tôi đã kiểm tra trong nguồn, nhưng không phải là thư mục/gói (vì tôi không cần phải .... đúng!). Khi TeamCity hoặc nhà phát triển khác lấy nguồn và chạy MSBuild, họ nhận được lỗi sau:NuGet Restore Không có phụ thuộc khi phụ thuộc thêm mục nhập .target vào .csproj

C:\TeamCity\buildAgent\work\e374975c0264c72e\ProjectName\ProjectName.csproj(70, 3): error MSB4019: The imported project "C:\TeamCity\buildAgent\work\e374975c0264c72e\packages\PostSharp.2.1.5.1\tools\PostSharp.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. 

Vấn đề là, NuGet chưa chạy chưa khôi phục/tải PostSharp hoặc nó .targets tập tin. Điều này cảm thấy giống như một lỗi NuGet với tôi, nhưng muốn xem liệu những người khác có cùng vấn đề này hay không.

Bất kỳ ai gặp sự cố này hoặc biết độ phân giải. Có, tôi có thể check-in thư mục/packages, nhưng tại sao lại sử dụng NuGet?

Trả lời

1

@ porterhouse91, bạn đã kiểm tra tệp csproj của mình để đảm bảo tệp đã được thiết lập với mục tiêu xây dựng thích hợp chưa?
Tôi chưa thử tính năng Khôi phục gói tích hợp sẵn mới, nhưng tôi giả sử nó hoạt động ít nhất là giống như các luồng công việc trước đó trên mạng nội bộ. Nếu đúng như vậy, việc bật Gói Khôi phục trong giải pháp của bạn chỉ ảnh hưởng đến các dự án trong giải pháp của bạn tại thời điểm bạn bật nó. Nếu bạn đã thêm một dự án mới (có NuGet phụ thuộc) vào giải pháp kể từ khi bật Khôi phục gói, bạn sẽ cần phải kích hoạt lại nó. Khả năng khác: các luồng công việc trước đây có liên quan đến thư mục .nuget mà bạn cần kiểm tra trong VCS, vì vậy bạn có thể cần phải kiểm tra xem liệu nó chưa được kiểm tra chưa (nếu tính năng Khôi phục Gói dựng sẵn có thực sự không sử dụng phương pháp này).

BTW, nếu câu trả lời này là hữu ích, cảm ơn Stephen Ritchie - anh ấy đã yêu cầu tôi chụp ảnh cho bạn.

1

Tôi cũng gặp vấn đề như thế này, nhưng tôi có thể sửa đổi tệp .targets trong gói nguồn để làm việc xung quanh nó. Về cơ bản, RestorePackages là một mục tiêu xây dựng chạy khi dự án được xây dựng. Thật không may, các gói phần mềm thậm chí sẽ không tải đúng trước khi nhập khẩu được hài lòng. Cách duy nhất tôi biết để sửa lỗi này là bao gồm tệp .targets dưới dạng nội dung và sau đó thay đổi thuộc tính BuildDependsOn để nó khôi phục các gói trước khi nó chạy các tác vụ tùy chỉnh của bạn.

<PropertyGroup> 
    <BuildDependsOn Condition="$(BuildDependsOn.Contains('RestorePackages'))"> 
    RestorePackages; 
    CustomTarget; 
    $(BuildDependsOn); 
    </BuildDependsOn> 
    <BuildDependsOn Condition="!$(BuildDependsOn.Contains('RestorePackages'))"> 
    CustomTarget; 
    $(BuildDependsOn); 
    </BuildDependsOn> 
</PropertyGroup> 

Để rõ ràng, điều này không giúp ích cho gói dựng sẵn, nhưng nếu bạn có thể tự mình xây dựng lại gói, bạn có thể khắc phục.

0

Tôi đã gặp vấn đề tương tự với gói Visual Studio 2012 và NuGet không được kiểm tra trong điều khiển nguồn.

Lỗi:

The imported project "\packages\Microsoft.Bcl.Build.1.0.7\tools\Microsoft.Bcl.Build.targets" was not found. 
Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. 

Tôi tìm thấy một MSDN writeup về tình hình mà đưa ra cách giải quyết sau đây để lấy một dự án từ kiểm soát nguồn mà không có gói NuGet.

  1. Dừng sử dụng gói phục hồi và check-in tất cả các file gói
  2. Rõ ràng chạy gói khôi phục trước khi xây dựng dự án
  3. Kiểm tra-trong .targets file

Tôi quyết định đi với tùy chọn # 2, tuy nhiên, NuGet hiện tại (v2.6) không bao gồm một cách để cài đặt tất cả các gói từ tệp packages.config từ trong studio trực quan.Một số tìm kiếm tiết lộ rằng bạn cần sử dụng NuGet Command Line để thực hiện lệnh sau trước khi mở Visual Studio (reference).

c:\path\to\nuget.exe install -o packages project-folder\packages.config 
3

cách tiếp cận khác là để sửa đổi các yếu tố <Import> trong câu hỏi, để làm cho nó có điều kiện, ví dụ .:

<Import Project="$(CodeAssassinTargets)" Condition="Exists($(CodeAssassinTargets))" /> 

này phụ thuộc vào một tài sản mới được định nghĩa trong một sớm <PropertyGroup>. Tôi thường thêm một ở phía trên cùng của tập tin csproj với khác cờ "toàn cầu", ví dụ:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <CodeAssassinTargets>$(SolutionDir)packages\CodeAssassin.ConfigTransform.1.1\tools\CodeAssassin.ConfigTransform.targets</CodeAssassinTargets> 
     <AutoParameterizationWebConfigConnectionStrings>false</AutoParameterizationWebConfigConnectionStrings> 
     <UseMsdeployExe>true</UseMsdeployExe> 
    </PropertyGroup> 

Sau đó, trong một mục tiêu thích hợp, như BeforeBuild, đưa ra một thông báo lỗi hữu ích:

<Target Name="BeforeBuild"> 
    <Error Text="CodeAssassin.ConfigTransforms target is missing. It needs to exist at $(CodeAssassinTargets) in order to build this project!" Condition="!Exists($(CodeAssassinTargets))" /> 
</Target> 

Với những sửa đổi, dự án sẽ tải ngay cả khi khôi phục gói nuget chưa bao giờ được thực hiện. Nếu tính năng khôi phục gói tự động được bật, nỗ lực xây dựng đầu tiên sẽ xóa vấn đề mục tiêu bị thiếu, nhưng nếu không, một khôi phục gói thủ công sẽ là.

Các vấn đề liên quan