toe*_*ens 271 msbuild dependencies reference project visual-studio
我的Visual Studio解决方案中有四个项目(每个人都针对.NET 3.5) - 对于我的问题,这两个项目很重要:
我加入了elmah.dll参考MyBaseProject通过点击在Visual Studio 2008中的"添加引用..."→"浏览"选项卡→选择"elmah.dll".
Elmah Reference的属性如下:
在MyWebProject1中,我通过以下方式添加了对Project MyBaseProject的引用:"Add reference ..."→"Projects"选项卡→选择"MyBaseProject".除以下成员外,此引用的属性相同:
如果我在Visual Studio中运行构建,则elmah.dll文件将与MyBaseProject.dll一起复制到MyWebProject1的bin目录中!
但是,如果我清理并运行MSBuild解决方案(通过D:\ webs\CMS> C:\ WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe/t:ReBuild/p:Configuration = Debug MyProject.sln )MyWebProject1的bin目录中缺少 elmah.dll - 虽然构建本身不包含警告或错误!
我已经确定MyBaseProject的.csproj包含值为"true" 的私有元素(它应该是Visual Studio中" copy local " 的别名):
<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>
Run Code Online (Sandbox Code Playgroud)
(默认情况下,私有标签没有出现在.csproj的xml中,虽然Visual Studio说"copy local"为true.我将"copy local"切换为false - 保存 - 并再次将其设置为true - 保存!)
MSBuild有什么问题?如何将(elmah.dll)引用复制到MyWebProject1的bin?
我不想为每个项目的postbuild命令添加postbuild复制操作!(想象一下,我会有很多项目依赖于MyBaseProject!)
and*_*rew 169
我只是像这样处理它.转到引用的属性并执行以下操作:
Set "Copy local = false"
Save
Set "Copy local = true"
Save
Run Code Online (Sandbox Code Playgroud)
就是这样.
Visual Studio 2010最初没有放入:
<private>True</private>
在引用标记中并将"copy local"设置为false会导致它创建标记.之后它将相应地设置为true和false.
dea*_*dog 147
我不确定为什么在Visual Studio和MsBuild之间构建时会有所不同,但这是我在MsBuild和Visual Studio中遇到此问题时发现的内容.
对于示例场景,假设我们有项目X,程序集A和程序集B.程序集A引用程序集B,因此项目X包含对A和B的引用.此外,项目X包含引用程序集A的代码(例如A. SomeFunction()).现在,您创建一个引用项目X的新项目Y.
所以依赖链看起来像这样:Y => X => A => B.
Visual Studio/MSBuild试图变得聪明,只将引用引入它检测为项目X所需的项目Y; 这样做是为了避免项目Y中的参考污染.问题是,由于项目X实际上不包含任何明确使用程序集B的代码(例如B.SomeFunction()),VS/MSBuild不会检测到B是必需的通过X,因此不会将其复制到项目Y的bin目录中; 它只复制X和A程序集.
您有两个选项可以解决此问题,这两个选项都会导致程序集B被复制到项目Y的bin目录中:
我个人更喜欢选项2,原因有两个.
以下是我在遇到这种情况时通常会添加的"虚拟代码"示例.
// 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);
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*ter 38
如果您没有直接在代码中使用程序集,那么Visual Studio在尝试帮助时会检测到它未被使用,并且不会将其包含在输出中.我不确定为什么你会在Visual Studio和MSBuild之间看到不同的行为.您可以尝试将构建输出设置为两者的诊断,并比较结果以查看它的分歧.
至于你的elmah.dll参考,如果你没有直接在代码中引用它,你可以将它作为一个项目添加到你的项目中,并将Build Action设置为Content
和Copy to Output Directory Always
.
toe*_*ens 14
看一眼:
你会在那里找到我的临时解决方案/解决方法!
(MyBaseProject需要一些引用elmah.dll中某些类(无论如何)的代码,以便将elmah.dll复制到MyWebProject1的bin!)
我面临的问题是我有一个依赖于图书馆项目的项目.为了构建我遵循以下步骤:
msbuild.exe myproject.vbproj /T:Rebuild
msbuild.exe myproject.vbproj /T:Package
Run Code Online (Sandbox Code Playgroud)
那当然意味着我在bin中丢失了我的库的dll文件,最重要的是在包zip文件中.我发现这很完美:
msbuild.exe myproject.vbproj /T:Rebuild;Package
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这项工作或为什么它一开始就没有.但希望有所帮助.
正如 Alex Burtsev 在评论中提到的,任何只在 XAML 资源字典中使用的东西,或者在我的例子中,只在 XAML 中使用而不是在代码背后的任何东西,都不会被 MSBuild 视为“正在使用”。
因此,只需在后面的某些代码中新建对程序集中的类/组件的虚拟引用,就足以让 MSBuild 相信该程序集已在实际使用中。
小智 5
使用deadlydog的方案,
Y => X => A => B ,
我的问题是当我构建 Y 时,来自 X 的程序集(A 和 B,全部 15 个)没有出现在 Y 的 bin 文件夹中。
我通过从 Y 中删除引用 X,保存,构建,然后重新添加 X 引用(项目引用),并保存、构建和 A 和 B 开始显示在 Y 的 bin 文件夹中来解决它。
归档时间: |
|
查看次数: |
141876 次 |
最近记录: |