我正在 Visual Studio 中整理一个模板项目供我的部门使用。项目需要引用一些存储在TFS其他地方的常用库。问题是模板可能会在各种位置使用,而我在尝试可靠地设置 HintPath 以处理所有位置时遇到了麻烦。
模板化项目需要能够在本地和 TFS 中找到公共库,以便在构建中使用。目前,在我们现有的应用程序中,引用如下所示:
<Reference Include="Company.Common">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)
但是到达根节点需要遍历的父节点数量可能会有所不同。
与其为 ../、../../、../../../ 等设置 50 个条件路径,我的第一个想法是设置一个绝对引用。工作文件夹在我们的组织中是标准化的,因此在本地,始终可以在 C:\Projects\Core Components\...
但这不适用于服务器构建。所以我想我需要某种环境变量来解决 $/. 我正在想象这样的事情:
<Choose>
<When Condition="Exists('C:\Projects')">
<ItemGroup>
<Reference Include="Company.Common">
<HintPath>C:\Projects\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="Company.Common">
<HintPath>$(TFSRoot)\Core Components\Libraries\Company.Common\Latest\Company.Common.dll</HintPath>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何实现这一点。
更新:
最终,我们确实建立了一个内部 Nuget 服务器。我建议任何有同样困境的人解决任何阻碍您设置 Nuget 的繁文缛节。我们用这种老套的做事方式生活了 3 年,总有一些新的问题需要人工干预。
tfs environment-variables csproj tfsbuild visual-studio-templates
我正在尝试从另一个解决方案引用一个C#DLL项目,但构建是在一个非常奇怪的输出文件夹中生成DLL.
目录内容是这样的:
c:\a\b\c\src\Solution.sln
c:\a\x\y\z\MyDLL\MyDLL.csproj
Run Code Online (Sandbox Code Playgroud)
在MyDLL.csproj不具有<OutputPath>标记.但它有一个我经常看不到的<SolutionDir>标签.
计算的输出路径,如Properties视图中所示,恰好是:
..\..\..\..\b\c\src-z\MyDLL\objd\i386
Run Code Online (Sandbox Code Playgroud)
这对应于此路径:
c:\a\b\c\src-z\src\MyDLL\objd\i386
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我不知道配置src-z的任何东西.我想知道Visual Studio是否正在计算带连字符的路径?
我想解决这个问题,可能会改变<SolutionDir>,但我不想打破其他解决方案.
计算似乎在构建过程的早期发生,因为构建器记录的第一件事是:
1>Project 'MyDLL (x\y\z\MyDLL\MyDLL.csproj)' is not up to date.
Input file 'x\y\z\MyDLL\MyDLL.csproj' is modified after output
file 'c:\a\b\c\src-z\src\MyDLL\objd\i386\MyDLL.pdb'.
Run Code Online (Sandbox Code Playgroud)
那么,当找不到项目<OutputPath>标签时,VS使用什么算法来计算输出路径?
在project.json项目系统下,我能够指定每个框架的框架程序集依赖关系。dotnet 文档(现已过时)显示了以下示例。
{
"frameworks":{
"net20":{
"frameworkAssemblies":{
"System.Net":""
}
},
"net35":{
"frameworkAssemblies":{
"System.Net":""
}
},
"net40":{
"frameworkAssemblies":{
"System.Net":""
}
},
"net45":{
"frameworkAssemblies":{
"System.Net.Http":"",
"System.Threading.Tasks":""
}
},
".NETPortable,Version=v4.5,Profile=Profile259": {
"buildOptions": {
"define": [ "PORTABLE" ]
},
"frameworkAssemblies":{
"mscorlib":"",
"System":"",
"System.Core":"",
"System.Net.Http":""
}
},
"netstandard16":{
"dependencies":{
"NETStandard.Library":"1.6.0",
"System.Net.Http":"4.0.1",
"System.Threading.Tasks":"4.0.11"
}
},
}
}
Run Code Online (Sandbox Code Playgroud)
对于更新后的 dotnet sdk v1.1.1,如何在 csproj 下执行此操作?我想引用 net40 的 System.Configuration,但不引用 netstandard 1.6。
我正在尝试将 stylecop.json 包含在 Visual Studio 2017 上的 C# 项目中。我已经弄清楚如何通过在任何文本编辑器中修改 .csproj 来实现此目的:
<AdditionalFiles Include="stylecop.json">
<Link>stylecop.json</Link>
</AdditionalFiles>
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种方法可以在不进行任何文本编辑的情况下执行此操作。我知道我总是可以像任何其他文件一样添加它,但这会在项目文件夹中创建文件的副本,而不是在外部链接它。
我已将我的类库更改为新的 csproj 样式,现在我看到下面Assemblies有一些自动添加的引用,我无法删除。它们从哪里来,为什么在那里?
截图示例:
请注意,这不会引起任何问题。看起来很奇怪,很想知道为什么要添加这些。我用谷歌搜索了这个问题,但找不到任何东西
当使用dumpbin来查看我的媒体库的详细信息:
dumpbin /headers Test.dll
我看到 {{FullFolder to Test.pdb}} 是 pdb 的完整文件夹。
调试目录
Time Type Size RVA Pointer
-------- ------- -------- -------- --------
95BA9373 cv A1 000199D4 17BD4 Format: RSDS, {4AF64893-BAF4-4FF3-9343-E8D5A55E94FF}, 1, {{FullFolder to Test.pdb}}
00000000 repro 0 00000000 0
Run Code Online (Sandbox Code Playgroud)
有没有办法在 csproj 文件中排除这个?
我的 .csproj 看起来像:
<DebugType>full</DebugType>
<IncludeSource>True</IncludeSource>
<IncludeSymbols>True</IncludeSymbols>
<PdbPath>none</PdbPath>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
Run Code Online (Sandbox Code Playgroud)
似乎该PdbPath元素不再以新的(vs2017 多框架) .csproj 格式工作?
此时,我的 .csproj 文件包含 XPath /Project/PropertyGroup/VersionPrefix,它确定 nuget 包的版本。但是,我更愿意从共享文件中读取此版本前缀,因为这对于 3 或 4 个项目来说很常见,每个项目都有自己的 .csproj 文件。
换句话说,而不是有
<VersionPrefix>2.0.0</VersionPrefix>
我们希望有类似的东西
@@include ../../version.xml
并且此 version.xml 包含上面将被替换的行。
我确信有多种方法可以实现这一目标,但无法确切了解如何实现。如有帮助,将不胜感激。
在我的 csproj 中,我有一个预构建事件,我在其中运行 Vue js 项目的构建。它输出到“dist”文件夹,并由 cshtml 文件加载。
在 csproj 文件中,我有一个对 dist 文件夹的引用,我告诉它复制到发布目录:
<ItemGroup>
<Content Include="dist\**" CopyToPublishDirectory="Always" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
在发布时,MsBuild 似乎试图复制在预构建事件开始之前存在的 dist 文件夹中的文件。有没有办法让 MsBuild 在预构建事件之后复制文件夹的内容?
我在Mac OS X上的.NET Core中创建了一个新的.NET类库项目.在项目构建期间,我想将文件复制到调试目录中.如何将其添加到.csproj文件中?
.NET Command Line Tools (1.0.1)
Product Information:
Version: 1.0.1
Commit SHA-1 hash: 005db40cd1
Runtime Environment:
OS Name: Mac OS X
OS Version: 10.12
OS Platform: Darwin
RID: osx.10.12-x64
Base Path: /usr/local/share/dotnet/sdk/1.0.1
Run Code Online (Sandbox Code Playgroud) 我已将AfterBuild目标添加到Visual Studio项目,这是包含多个Visual Studio项目的解决方案的一部分。
解决方案设置示例
例子.sln
ExampleProj.csproj
ExampleProj.Test.csproj
目标示例:
<Target Name="PostBuildScript" AfterTargets="AfterBuild" Condition="'$(Configuration)' == 'Release'">
<PropertyGroup>
<BuildCommand>"SomeApplication.exe")</BuildCommand>
</PropertyGroup>
<Exec Command="$(BuildCommand)" ConsoleToMSBuild="true" LogStandardErrorAsError="true" WorkingDirectory="$(ProjectDir)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
我希望此目标仅在解决方案中的所有Visual Studio项目都已建立之后才能执行。
有没有办法实现这一目标。
注意:dotnet build在Visual Studio中使用和生成命令时,我的行为必须相同。