Tương đương với hội nghịInfo trong lõi dotnet / csproj


236

Vì lõi dotnet được chuyển trở lại .csprojđịnh dạng, có một phần tự động mới MyProject.AssemblyInfo.csđược chứa trong số khác.

[assembly: AssemblyCompany("MyProject")]
[assembly: AssemblyVersion("1.0.0.0")]

Lưu ý rằng điều này được tự động tái tạo mỗi bản dựng. Trước đây tệp được tìm thấy trong thư mục / obj /, bây giờ nó chỉ xuất hiện trong bộ nhớ vì không thể tìm thấy tệp trên đĩa và nhấp vào thông báo lỗi không mở bất kỳ tệp nào.

Đây là thông báo lỗi: nhập mô tả hình ảnh ở đây

Vì chúng được định nghĩa nên tôi không thể tự định nghĩa chúng theo cách cổ điển AssemblyInfo.cs.

Tôi có thể định nghĩa Công ty và Phiên bản của dự án ở đâu / như thế nào?


5
Lưu ý rằng điều này không liên quan chặt chẽ đến lõi dotnet. Điều này khá liên quan đến định dạng dựa trên .csproj mới. Hoàn toàn ổn khi sử dụng định dạng .csproj mới này với việc nhắm mục tiêu .NET Framework cũ, ví dụ net461
Jim Aho

Câu trả lời:


333

Như bạn đã nhận thấy, bạn có thể kiểm soát hầu hết các cài đặt này trong .csproj.

Nếu bạn muốn giữ những thứ này trong AssociationInfo.cs, bạn có thể tắt các thuộc tính lắp ráp được tạo tự động.

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

Nếu bạn muốn xem những gì đang diễn ra dưới mui xe, hãy kiểm tra Microsoft.NET.GenerateAss lanhInfo.t Target bên trong Microsoft.NET.Sdk.


41
Vui mừng khi thấy rằng tôi có thể tắt điều này. Gọi tôi là kiểu cũ, nhưng tôi thích tệp Hội nghị cũ tốt hơn so với nội dung được tạo tự động của .netcore. Ngoài ra, tôi sử dụng công cụ bên ngoài để quản lý các phiên bản của mình và nội dung của các mục nhập khác của AssembyInfo. Tôi đã cố gắng sử dụng một mục tiêu tùy chỉnh để giữ các thuộc tính của mình ra khỏi dự án nhưng nó khiến tôi nghẹn ngào một lúc.
Ivaylo Slavov

1
Tương tự ở đây. Với hệ thống dựa trên csproj mới, tôi không thể sử dụng công cụ kế thừa của mình. Với tài sản này, bây giờ tôi có thể quay trở lại, mà tôi yêu thích!
Cấu trúc

5
NuGet không đọc AssociationInfo.cs. Bạn vẫn phải sử dụng các thuộc tính MSBuild để xác định phiên bản gói NuGet.
nHRcmaster

6
Khi tệp được tạo tự động, làm cách nào để đặt thuộc tính InternalsVisibleTo theo định dạng csproj mới?
Shubhan

8
@Shubhan đây không phải là một trong những thuộc tính được tạo tự động. Tạo một tệp .cs trống ở đâu đó trong dự án của bạn và thêm mã InternalsVisibleTo vào đó
nHRcmaster

128

Những cài đặt đó đã được chuyển vào tệp .csproj.

Theo mặc định, chúng không hiển thị nhưng bạn có thể khám phá chúng từ Visual Studio 2017 trong Packagetab thuộc tính dự án .

Thuộc tính dự án, gói tab

Sau khi lưu các giá trị đó có thể được tìm thấy trong MyProject.csproj

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net461</TargetFramework>
    <Version>1.2.3.4</Version>
    <Authors>Author 1</Authors>
    <Company>Company XYZ</Company>
    <Product>Product 2</Product>
    <PackageId>MyApp</PackageId>
    <AssemblyVersion>2.0.0.0</AssemblyVersion>
    <FileVersion>3.0.0.0</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Description>Description here</Description>
    <Copyright>Copyright</Copyright>
    <PackageLicenseUrl>License URL</PackageLicenseUrl>
    <PackageProjectUrl>Project URL</PackageProjectUrl>
    <PackageIconUrl>Icon URL</PackageIconUrl>
    <RepositoryUrl>Repo URL</RepositoryUrl>
    <RepositoryType>Repo type</RepositoryType>
    <PackageTags>Tags</PackageTags>
    <PackageReleaseNotes>Release</PackageReleaseNotes>
  </PropertyGroup>

Trong tab thông tin thuộc tính trình thám hiểm tệp, FileVersionđược hiển thị là "Phiên bản tệp" và Versionđược hiển thị là "Phiên bản sản phẩm"


1
Các thiết lập trong thuộc tính dự án dường như bị thiếu nếu loại dự án của tôi là Class Library (.NET Standard). Bạn có biết tại sao không? Tôi đang sử dụng Phiên bản 15.1, Phiên bản 26403.7, Phiên bản cộng đồng.
ventiseis

2
Tôi đang sử dụng Thư viện lớp (.NET Standard) và thấy nó trong tab Gói. Bạn có thấy nó ở đó không? Khi bạn "Lưu" thứ gì đó không phải là mặc định, nó sẽ hiển thị trong csproj.
tofutim

3
Làm thế nào để bạn sử dụng ký tự đại diện như 1.0. *. * Khi sử dụng tab gói?
Soenhay

@Soenhay, ký tự đại diện không có ý nghĩa gì khi xác định phiên bản gói, chỉ khi tiêu thụ nó.
Paul Hatcher

@Soenhay tôi hiểu là bạn không thể trừ khi bạn sử dụng tính năng tương tự trong các công cụ của bên thứ ba.
hultqvist

115

Tôi làm như sau cho các dự án .NET Standard 2.0 của tôi.

Tạo một Directory.Build.propstệp (ví dụ trong thư mục gốc của repo của bạn) và di chuyển các thuộc tính được chia sẻ từ .csprojtệp sang tệp này.

MSBuild sẽ tự động lấy nó và áp dụng chúng cho tự động tạo AssemblyInfo.cs.

Họ cũng được áp dụng cho gói nuget khi xây dựng một gói có dotnet packhoặc thông qua UI trong Visual Studio 2017.

Xem https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build


12
Điều này sẽ nhận được nhiều upvote hơn, tốt đẹp khi cho phép tự động tạo nhưng vẫn chia sẻ một số nội dung trong suốt giải pháp
Dan

@Dan Đồng ý, điều này thấp hơn nhiều so với các câu trả lời khác mà tôi nghi ngờ rằng hầu hết mọi người sẽ không đọc nó.
Lunyx

1
@Justin, bạn sẽ không thấy chúng trong các tệp dự án của bạn; họ được áp dụng trên các hội đồng được xây dựng kết quả.
pfx

1
Còn những người trong chúng ta không sử dụng msbuild thì sao?
Joe Phillips

1
Đây là một câu trả lời tuyệt vời. Cảm ơn bạn. Đã sử dụng nó trong giải pháp lớn của chúng tôi sản xuất một số gói NuGet và đây là một thay thế tuyệt vời cho thông tin lắp ráp cũ cho các dự án kiểu sdk mới
David Anderson

55

Bạn luôn có thể thêm riêng của bạn AssemblyInfo.cs , trong đó có cho tiện dụng InternalsVisibleToAttribute, CLSCompliantAttributevà những người khác mà không được tự động tạo ra.

Thêm hội nghịInfo.cs vào một dự án

  1. Trong Solution Explorer, nhấp chuột phải vào <project name> > Add > New Folder.

Thêm thư mục mới

  1. Đặt tên cho thư mục "Thuộc tính".

Tên thư mục Thuộc tính

  1. Nhấp chuột phải vào thư mục "Thuộc tính" và nhấp Add > New Item....

Thêm mục mới

  1. Chọn "Class" và đặt tên là "AssociationInfo.cs".

Tên tập tin AssociationInfo.cs

Loại bỏ các thuộc tính được tạo tự động

Nếu bạn muốn di chuyển thuộc tính của bạn trở lại AssemblyInfo.cs thay vì họ tự động tạo ra, bạn có thể ngăn chặn chúng trong MSBuild như natemcmaster chỉ ra trong câu trả lời của ông .


1
Cảm ơn NightOwl888, đây là câu trả lời mà tôi đang tìm kiếm.
Juniuz

3
Tôi sẽ tránh cho rằng mọi người đều có Visual Studio trong những ngày này, có một số trình soạn thảo khác có thể được sử dụng khiến cho câu trả lời này khó thực hiện đối với một số người (ví dụ: tôi đang làm điều này trên Mac / Mono bằng Jetbrains Rider)
PandaWood

6

Tôi muốn mở rộng chủ đề / câu trả lời này với những điều sau đây. Như ai đó đã đề cập, hội nghị được tạo tự động này có thể là một trở ngại cho các công cụ bên ngoài. Trong trường hợp của tôi, khi sử dụng FinalBuilder , tôi đã gặp phải một vấn đề là hội nghịInInfo không được cập nhật bằng hành động xây dựng. Rõ ràng, FinalBuilder dựa vào ~projtệp để tìm vị trí của Hội nghị . Tôi nghĩ rằng, nó đã tìm kiếm bất cứ nơi nào trong thư mục dự án. Không. Vì vậy, thay đổi điều này

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup> 

chỉ thực hiện một nửa công việc, nó cho phép thông tin lắp ráp tùy chỉnh nếu được xây dựng bởi VS IDE / MS Build. Nhưng tôi cần FinalBuilder làm điều đó mà không cần thao tác thủ công để tập hợp thông tin tập tin. Tôi cần phải đáp ứng tất cả các chương trình, MSBuild / VS và FinalBuilder.

Tôi đã giải quyết điều này bằng cách thêm một mục vào hiện tại ItemGroup

<ItemGroup>
   <Compile Remove="Common\**" />
   <Content Remove="Common\**" />
   <EmbeddedResource Remove="Common\**" />
   <None Remove="Common\**" />
   <!-- new added item -->
   <None Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

Bây giờ, có mặt hàng này, FinalBuilder tìm thấy vị trí của AssemblyInfo và sửa đổi các tập tin. Trong khi hành động Nonecho phép MSBuild / DevEnv bỏ qua mục này và không còn báo cáo lỗi dựa trên Compilehành động thường đi kèm với mục Thông tin hội trong projtệp.

C: \ Chương trình tập tin \ dotnet \ sdk \ 2.0.2 \ Sdks \ Microsoft.NET.Sdk \ build \ Microsoft.NET.Sdk.DefaultItems.target (263,5): lỗi: Đã bao gồm các mục trùng lặp 'Biên dịch'. .NET SDK bao gồm các mục 'Biên dịch' từ thư mục dự án của bạn theo mặc định. Bạn có thể xóa các mục này khỏi tệp dự án của mình hoặc đặt thuộc tính 'EnableDefaultCompileItems' thành 'false' nếu bạn muốn đưa chúng vào tệp dự án một cách rõ ràng. Để biết thêm thông tin, hãy xem https://aka.ms/sdkimplicititems . Các mục trùng lặp là: 'HộiInfo.cs'


5

Thêm vào câu trả lời của NightOwl888, bạn có thể tiến thêm một bước và thêm một AssemblyInfolớp thay vì chỉ một lớp đơn giản:

nhập mô tả hình ảnh ở đây


5
Không có "Tệp thông tin hội" khi tôi mở hộp thoại này trong VS2019 cho Dự án 1.1 tiêu chuẩn.
SwissCoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.